Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解原子功能_C_Atoi - Fatal编程技术网

C 理解原子功能

C 理解原子功能,c,atoi,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);` 在

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

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);`
在程序中,我所做的是读取每一行并将其分配给结构

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

采用以nul结尾的字符串。如果要限制数据长度
atoi
parses

采用nul终止字符串,则必须将自己的终止符添加到
成员中。如果要限制数据
atoi
parses

atoi()的长度,则必须将自己的终止符添加到
成员中。在您的情况下,字符串不会以零结尾,因此在读取y之后,atoi将读取z中的数据

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

sscanf(k->y,"%4d",&y);
atoi()假定字符串以零结尾。在您的情况下,字符串不会以零结尾,因此在读取y之后,atoi将读取z中的数据

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

sscanf(k->y,"%4d",&y);

atoi
函数需要以null结尾的字符串;您传递的是字符数组的一部分,其终止点超过了
key::y
的边界,因此
atoi
将整个值解释为一个数字。如果您想坚持使用“cookie cuter”方法解析密钥,则需要制作一份副本,并将其传递给
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);

atoi
函数需要以null结尾的字符串;您传递的是字符数组的一部分,其终止点超过了
key::y
的边界,因此
atoi
将整个值解释为一个数字。如果您想坚持使用“cookie cuter”方法解析密钥,则需要制作一份副本,并将其传递给
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);

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

您应该终止字符串(在字符串末尾加零)并停止使用
atoi()
(例如,改用
strtol()
);或者编写自己的转换,不需要终止字符串


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

您应该假设
atoi()
一直运行,直到到达字符串结尾或无效字符为止。例如,对于字符串“123zzz”,它将返回123

您应该终止字符串(在字符串末尾加零)并停止使用
atoi()
(例如,改用
strtol()
);或者编写自己的转换,不需要终止字符串


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

是否还有其他函数也采用该长度?是否有其他函数也采用该长度?下面是一个使用
scanf
的示例。下面是一个使用
scanf
的示例。fptr是文件指针,数据是从文件读取的。我解决了这个问题,我编写了自己的转换,inturn使用atoi fnfptr作为文件指针,从文件中读取数据。我解决了这个问题,我编写了自己的转换,inturn使用atoi fn