虽然我可以使用字符串,但我想理解为什么我正在处理的这个小例子以这种方式运行,我该如何解决?
int ReadInput() {
char buffer [5];
printf("Number: ");
fgets(buffer,5,stdin);
return atoi(buffer);
}
void RunClient() {
int number;
int i = 5;
while (i != 0) {
number = ReadInput();
printf("Number is: %d\n",number);
i--;
}
}
理论上或者至少在我的脑海中,这应该让我从输入中读取5个数字(尽管会覆盖它们)。
然而事实并非如此,无论如何都会读为0。
我理解printf会放一个\ 0 null终止符...但我仍然认为我应该能够读取第一个数字,而不是默认情况下只有它。我不明白为什么剩下的数字没问题(不是全部为0)。
澄清:我只能阅读4/5号码,首先是0号。
修改
我已经测试过,这似乎导致了这个问题:
的main.cpp
scanf("%s",&cmd);
if (strcmp(cmd, "client") == 0 || strcmp(cmd, "Client") == 0)
RunClient();
不知。
修改
如果有人想编译,这是代码。我还是不知道如何解决
最终编辑:
无法摆脱错误。决定简单地添加@ReadInput
int ReadInput(BOOL check) {
...
if (check)
printf ("Number: ");
...
@ RunClient()
void RunClient() {
...
ReadInput(FALSE); // a pseudo - buffer flush. Not really but I ignore
while (...) { // line with garbage data
number = ReadInput(TRUE);
...
}
并称之为一天。
答案 0 :(得分:3)
fgets
读取输入和换行符。因此,当您输入数字时,就像:123\n
。
atoi
不报告错误。
从buffer
:
buf[5];
size_t length = strlen(buffer);
buffer[length - 1]=0;
然后使用strtol
将字符串转换为数字,以便在转换失败时提供更好的错误检测。
答案 1 :(得分:1)
char * fgets ( char * str, int num, FILE * stream );
从流中获取字符串。
从流中读取字符并将它们作为C字符串存储到 str 中,直到读取了(num-1)个字符或者到达了换行符或文件结尾,以先发生者为准。
换行符使 fgets 停止读取,但该函数将其视为有效字符,并包含在复制到str的字符串中。 (这意味着您携带\ n)
在复制到str的字符后,将自动附加终止 null 字符。 请注意,fgets与gets非常不同:不仅fgets接受stream参数,而且还允许指定str的最大大小,并在字符串中包含任何结束的换行符。
PD:尝试使用更大的缓冲区。