atoi函数不适用于for循环

时间:2016-09-04 18:23:42

标签: c

我想得到这个等式的输出:

  

44 - 10 + 11/5

它正常运作如下:

char str[] = "44 - 10 + 11 / 5";
int sum = 0 ;
sum += atoi(str);   //  0 + 44
sum += atoi(str+3); // 44 + 10
sum += atoi(str+5); // 54 + 11
sum += atoi(str+7); // 65 / 5 = 13
printf("%d/n",sum); // output = 13

但如果我将atoi()函数放在for循环中,它就不起作用了:

char str[] = "44 - 10 + 11 / 5";
int sum = 0;
int i;
sum += atoi(str);
for (i = 0; i < 100; i++) {
    if (!(str[i] >= 0 && str[i] <= 9)) {   //if str[i] is not a number
        sum += atoi(str + i); 
    }
}
printf("%d/n", sum); // output = 0

4 个答案:

答案 0 :(得分:3)

您正在将包含数字ASCII表示的字符值与实际数字进行比较。改变

if(!(str[i]>=0 && str[i]<=9)){  

if(!(str[i]>='0' && str[i]<='9')){  

我没有检查其余代码是否正确,但当然,这是一个问题。

答案 1 :(得分:2)

   if(!(str[i]>=0 && str[i]<=9)){   //if str[i] is not a number

这是不正确的。 '0'和0不相同。 9和9都不是。 “9”的值将是整数,表示ASCII图表中的“9”。

其余的逻辑似乎也很可疑,例如,如果你有“55”会发生什么,代码会输入if两次,一次输入55次,第二次输入5次,不是吗?

答案 2 :(得分:2)

因为您的代码与前一代码的计算方式不同。在第一个中,您将指针移动到下一个数字,并将其添加到数字中,因此您的代码执行以下44 + 10 + 11 + 5

在第二种情况下,您要检查字符代码是否介于0到9之间,但数字介于48和57之间 - 字符&#39; 0&#39;和&#39; 9&#39;。因此if语句总是错误的。你的意图可能是这样,但它不会起作用。

for(i = 0; i < 100 ; i++){
   if(!(str[i]>='0' && str[i]<='9')){   //if str[i] is not a number
      sum += atoi(str+i); 
   }
}

这也不起作用,因为在这里您将指针的错误移位一,导致读取以下数字:44, 4, 10, 0, 11, 1, 5。由于atoi属性。要执行与您必须编写以下代码之前完全相同的代码:

int skip_non_diggits(int i, char *str) {
    while (str[i] < '0' || str[i] > '9') {
        if (str[i] == 0) 
            return -1; //end of string case
        i++;
    }
    return i;
}

int skip_diggits(int i, char *str) {
    while (str[i] >= '0' && str[i] <= '9') {
        if (str[i] == 0) 
            return -1; //end of string case
        i++;
    }
    return i;
}

这些功能可以按如下方式使用:

int i = 0, sum = 0;
while (i != -1) {
    sum += atoi(str+i);
    i = skip_diggits(i, str); // positions i after the current number
    i = skip_non_diggits(i, str); // positions i at the begin of the next number
}

<强>顺便说一句 不要使用for (i = 0; i < 100; i++)来迭代你不知道大小的字符串。如果字符串的长度小于100,那么您将解除引用内存,这可能不会导致您创建未定义的行为。而是检查strlen方法或检查字符是否不等于\0,其中C表示字符串的结尾。

答案 3 :(得分:1)

这看起来有点奇怪。目标是什么?

同意之前的评论。

为什么你在atoi()上做什么不是数字?

你将超过字符串的结尾。 您的空格COUNT在示例中

等等。 当你找到一个号码时你不会更新我,所以你会计算&#34; 44&#34;第44位和第4位。

如果您正在尝试学习,请连接调试器,逐步执行代码,并查看数据的更改方式。