在C中将字符串转换为整数时的奇怪行为

在C中将字符串转换为整数时的奇怪行为,c,string,C,String,他正在编写一个程序,将一个数学表达式作为字符串,然后对它求值,发现了一个奇怪的行为。给定 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]){ int ary[4]; char * string = "123+11"; for (int i = 0; i < 3; i++){

他正在编写一个程序,将一个数学表达式作为字符串,然后对它求值,发现了一个奇怪的行为。给定

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){

    int ary[4];
    char * string = "123+11";

    for (int i = 0; i < 3; i++){

        ary[i] = atoi(&string[i]);
        printf("%d\n", ary[i]);
    }

}
然而,我可能预期我会得到输出:

123
23
3
1
2
3

这是
atoi()
函数的一部分吗?

这是正确的行为,因为
atoi
将指向char的指针作为输入,并将其转换为
int
,直到找到“
\0
”字符

char * string = "123";
字符串中的“
\0
”出现在123之后

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从1开始,将其转换为
int
直到123

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从2开始,将其转换为
int
直到23

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从3开始将其转换为
int
直到3


如果不清楚,请告诉我。

这是正确的行为,因为
atoi
将指向char的指针作为输入,并将其转换为
int
,直到找到“
\0
”字符

char * string = "123";
字符串中的“
\0
”出现在123之后

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从1开始,将其转换为
int
直到123

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从2开始,将其转换为
int
直到23

对于声明:

ary[0] = atoi(&string[0]);
ary[1] = atoi(&string[1]);
 ary[2] = atoi(&string[2]);
atoi
从3开始将其转换为
int
直到3


如果不清楚,请告诉我。

用户3758647给出的答案是正确的。要解决这个问题,可以使用
strtok
函数,该函数根据分隔符标记输入字符串

char* string = "123+23+22";
char *token = strtok(string, "+");
int arr[4], i = 0;
arr[i] = atoi(token); //Collect first number here
while (token != NULL)
{
    token = strtok(NULL, " ");
    //You can collect rest of the numbers using atoi function from here
    i++;
    arr[i]  = atoi(token); 
    //Do whatever you want to do with this number here.
}
return 0;

用户3758647给出的答案是正确的。要解决这个问题,可以使用
strtok
函数,该函数根据分隔符标记输入字符串

char* string = "123+23+22";
char *token = strtok(string, "+");
int arr[4], i = 0;
arr[i] = atoi(token); //Collect first number here
while (token != NULL)
{
    token = strtok(NULL, " ");
    //You can collect rest of the numbers using atoi function from here
    i++;
    arr[i]  = atoi(token); 
    //Do whatever you want to do with this number here.
}
return 0;

对您想提取一位数吗?那么为什么不干脆
string[i]-“0”
atoi
strtod
解析整个字符串。请记住,
atoi
是数组到int,而不是ascii到int。是的!您想提取一位数吗?那么为什么不干脆
string[i]-“0”
atoi
strtod
解析整个字符串。请记住,
atoi
是数组到int,而不是ascii到int。实际上,它会进行转换,直到找到一个非数字字符(不一定是
\0
)^并且允许有一个前导的
+
-
,它进行转换,直到找到一个非数字字符(不一定是
\0
)^,并且允许有一个前导
+
-