我一直试图弄清楚如何将输入的字符串转换为整数。我在网上找到了这个功能的代码:
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?
非常感谢任何帮助
答案 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
向后退了?它应该是fromString
或toInteger
。这是该网站上一些糟糕的质量保证。
答案 1 :(得分:0)
n在第一次迭代时等于0,在一次迭代后n等于a [c]的值。请参阅Horner计划以了解它在数学上是如何工作的。 -'0'用于将结果转换为整数。
答案 2 :(得分:0)
'\ 0'是字符串的终止字符,乘法* 10是计算正确的数十,数百等......