试图了解这个字符串到整数函数的工作原理

问题描述:

我一直在想如何将输入的字符串转换为整数。我发现这个功能的在线代码:试图了解这个字符串到整数函数的工作原理

int toString(char a[]) { 
int c, sign, offset, n; 
    if (a[0] == '-') { // Handle negative integers 
    sign = -1; 
    } 
    if (sign == -1) { // Set starting position to convert 
    offset = 1; 
    } 
    else { 
    offset = 0; 
    } 
n = 0; 
    for (c = offset; a[c] != '\0'; c++) { 
    n = n * 10 + a[c] - '0'; 
    } 
    if (sign == -1) { 
    n = -n; 
} 
return n; 
} 

链接here 代码工作,但我不明白为什么。具体来说,我不明白这部分是如何工作的:

 n = 0; 
     for (c = offset; a[c] != '\0'; c++) { 
     n = n * 10 + a[c] - '0'; 
     } 

如果n = 0,乘以10会如何影响结果?另外,如果限制因子是[c]!='\ 0',for循环如何结束?一个[c]如何等于零?

任何帮助将不胜感激

+1

这不是教程服务。如果您自己编写代码时遇到困难,请将其发布并解释发生了什么问题。 –

+1

n最初只有0,此后一旦添加了'a [c] - '0',它将会改变,然后可能会受到后面乘法的影响。 – Annabelle

+0

提示:乘以10与后续迭代有关。显然,不是第一个。 –

在第一迭代n等于0时,一次迭代后N个相等的[C]的值。参见Horner计划来了解它在数学上的工作原理。 -'0'在这里将结果转换为整数。

“\ 0”是字符串的终止符和乘法* 10来计算的数十,数百等正确的值...

代码工作[...]

不,因为sign未初始化,但在字符串未以-开头时使用。技术上,代码有未定义的行为

请忘记那个网站;它质量低下,不会教你适当的C编程。例如。这些都是由铛产生的警告:

$ cc -c -Wall x.c 
x.c:4:7: warning: variable 'sign' is used uninitialized whenever 'if' condition is false 
     [-Wsometimes-uninitialized] 
    if (a[0] == '-') { // Handle negative integers 
     ^~~~~~~~~~~ 
x.c:8:7: note: uninitialized use occurs here 
    if (sign == -1) { // Set starting position to convert 
     ^~~~ 
x.c:4:3: note: remove the 'if' if its condition is always true 
    if (a[0] == '-') { // Handle negative integers 
    ^~~~~~~~~~~~~~~~~ 
x.c:2:14: note: initialize the variable 'sign' to silence this warning 
    int c, sign, offset, n; 
      ^
       = 0 
1 warning generated. 

任何站点自称教授C必须使用游离的警告的例子(除非代码的点是展示错误)。

你是否意识到函数名称toString有反向?它应该是fromStringtoInteger。这是该网站的一些糟糕的质量保证。

+0

不@Jens你有警告但这部分不是UB。他检查一个特定的值。符号具有任何其他值(并且这是未初始化的局部变量的问题),代码以绝对定义的方式运行。 –

+0

@ PeterJ_01然后你对未定义行为的理解与C标准阐明的不同:* C99#J.2未定义行为*,具有自动存储持续时间的对象的值在不确定时使用(6.2 .4,6.7.8,6.8)。 – Jens