我正在标记化,并在带有分隔符'='的文本文件(已读入数组'store')上使用strtok
所以文件中有一条声明:TCP.port = 180
我做到了:
str = strtok(store, "=");
str= strtok(NULL, "=");
现在,如果我这样做*str
,它会给我 '82'(可能是一些垃圾值)但atoi(str);
给我 180(正确值)
我希望有人能对此有所了解,不应该取消引用 str 给我 180 吗?
编译并运行这个程序。它应该让您更好地了解正在发生的事情。
#include <stdlib.h>
#include <stdio.h>
int main(void) {
const char *s = "180";
printf("s = \"%s\"\n", s);
printf("atoi(s) = %d\n", atoi(s));
printf("*s = %d = '%c'\n", *s, *s);
return 0;
}
这是输出:
s = "180"
atoi(s) = 180
*s = 49 = '1'
No.atoi
为您提供由字符串str
指向的整数表示的整数。取消引用str
(*str) 为您提供 charstr
指向的值(这不是您写入的值)。
您需要准确了解字符串在 C 中是如何工作的,才能了解这里发生了什么。该str
变量是指向字符串中第一个字符的指针。解引用str
给出了 所指向的值str
,即字符'1'
。同样,取消引用str+1
将为您提供下一个字符'8'
. 您可以看到字符串的结尾是如何用*(str+3)
(或等价的str[3]
)表示的,它给出了一个空字节。该函数atoi
知道如何将字符解释为 ASCII 字符的 base-10 字符串,这比取消引用要复杂得多。