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

时间:2014-07-11 02:56:48

标签: 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++){

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

}

我得到了输出:

123
23
3

虽然我可能期望得到输出:

1
2
3

这是atoi()功能的一部分吗?

2 个答案:

答案 0 :(得分:4)

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

char * string = "123";

&#34; \0&#34;字符串在123之后出现。

声明:

ary[0] = atoi(&string[0]);

atoi从1开始将其转换为int直到123。

声明:

ary[1] = atoi(&string[1]);

atoi从2开始将其转换为int直到23。

声明:

 ary[2] = atoi(&string[2]);

atoi以3开头将其转换为int直到3。

如果不清楚,请告诉我。

答案 1 :(得分:1)

user3758647给出的答案是正确的。要解决您的问题,您可以使用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;