您好我有一个包含以下数据的文本文件
ABC00011234567
XYZ00021234567
为了获取数据,我定义了一个结构
typedef struct data {
char x[3];
char y[4];
char z[7];
} key;
在程序中,我所做的是读取每一行并将其分配给结构
unsigned char buf[1024];
fgets(buf,sizeof(buf),fptr);
key *k=(key*)buf;
int y = atoi(k->y)
printf( "y=%d\n",y);`
我的输出为
y=1123456
y=2123456
我希望的输出是
y=1
y=2
我应该假设,atoi接受字符串的指针并迭代直到遇到EOF?
我该怎么做才能获得值1
和2
?
答案 0 :(得分:2)
atoi采用以空字符结尾的字符串。如果要限制数据长度key
解析
atoi
成员
答案 1 :(得分:2)
您应该假设atoi()
一直持续到字符串结尾或无效字符为止。例如,对于字符串“123zzz”,它将返回123。
你应该终止你的字符串(在它们的末尾加零)并停止使用atoi()
(例如改为使用strtol()
);或编写自己的转换,不需要终止字符串。
注意:(一般情况下)atoi()
永远不应该用于编写编译器以外的任何东西,因为它做的事情对普通人没有意义(例如“0129”是10和不是129,因为它决定数字是八进制而9不是八进制的有效数字。
答案 2 :(得分:1)
atoi()假设一个零终止字符串。在您的情况下,字符串不会以零结尾,因此在读取y之后,atoi中的数据将被读取。
要只阅读4位数字,您可以使用sscanf:
sscanf(k->y,"%4d",&y);
答案 3 :(得分:1)
atoi
函数需要以空字符结尾的字符串;您正在传递其终止超出key::y
边界的char数组的一部分,因此atoi
将整个值解释为数字。如果您想坚持使用解析密钥的“cookie cutter”方法,则需要制作副本,并将其传递给atoi
:
char temp[5];
memcpy(temp, k->y, 4);
temp[4] = '\0';
int y = atoi(temp);
但是,我认为使用fscanf
是更好的选择:
char x[4];
int y, z;
fscanf(fptr, "%3s%4d%7d", x, &y, &z);
printf("%s %d %d", x, y, z);