我想得到这个等式的输出:
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
答案 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位。
如果您正在尝试学习,请连接调试器,逐步执行代码,并查看数据的更改方式。