了解ATOI功能

时间:2012-10-09 10:40:36

标签: c atoi

您好我有一个包含以下数据的文本文件

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 个答案:

答案 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);