试图理解这个字符串到整数的功能是如何工作的

时间:2017-09-24 19:46:18

标签: c

我一直试图弄清楚如何将输入的字符串转换为整数。我在网上找到了这个功能的代码:

 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&#39 ;?,for循环如何结束? a [c]如何等于null?

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

  

代码有效[...]

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

请忘记该网站;它质量低,不会教你正确的C编程。例如。这些是clang产生的警告:

$ 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。这是该网站上一些糟糕的质量保证。

答案 1 :(得分:0)

n在第一次迭代时等于0,在一次迭代后n等于a [c]的值。请参阅Horner计划以了解它在数学上是如何工作的。 -'0'用于将结果转换为整数。

答案 2 :(得分:0)

'\ 0'是字符串的终止字符,乘法* 10是计算正确的数十,数百等......