0

嗨,我有一个包含以下数据的文本文件

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?我应该怎么做才能获得价值12

4

4 回答 4

2

atoi采用一个以 nul 结尾的字符串。key如果您想限制数据atoi解析的长度,您必须将自己的终止符添加到您的成员中

于 2012-10-09T10:43:33.323 回答
2

您应该假设它atoi()一直持续到它到达字符串的末尾或无效字符。例如,对于字符串“123zzz”,它会返回 123。

您应该终止您的字符串(在它们的末尾放置一个零)并停止使用atoi()(例如strtol()改用);或编写您自己的不需要终止字符串的转换。

注意:(通常)atoi()不应该用于编写编译器以外的任何事情,因为它所做的事情对普通人来说没有意义(例如,“0129”是 10 而不是 129,因为它决定数字是八进制并且9 不是八进制的有效数字)。

于 2012-10-09T10:55:51.060 回答
1

atoi() 假定以零结尾的字符串。在您的情况下,字符串不会以零结尾,因此在读取 y 后, atoi 会读取 z 中的数据。

要仅读取 4 位数字,您可以使用 sscanf:

sscanf(k->y,"%4d",&y);
于 2012-10-09T10:43:40.937 回答
1

atoi函数需要一个以空字符结尾的字符串;您正在传递其终止超出边界的 char 数组的一部分key::y,因此atoi将整个值解释为一个数字。如果您想坚持使用“千篇一律”的方法来解析密钥,则需要制作一个副本,并将其传递给atoi

char temp[5];
memcpy(temp, k->y, 4);
temp[4] = '\0';
int y = atoi(temp);

但是,我认为 usingfscanf是一个更好的选择:

char x[4];
int y, z;
fscanf(fptr, "%3s%4d%7d", x, &y, &z);
printf("%s %d %d", x, y, z);
于 2012-10-09T10:43:41.763 回答