2

虽然我可以使用字符串,但我想了解为什么我正在处理的这个小示例会以这种方式运行,我该如何解决?

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 空终止符......但我仍然认为我应该能够读取第一个数字,而不仅仅是默认为 0。而且我不明白为什么其余的数字都可以(并非全为 0)。

澄清:我只能读取 4/5 的数字,第一个总是 0。

编辑:

我已经测试过,似乎这是导致问题的原因:

主文件

scanf("%s",&cmd);
    if (strcmp(cmd, "client") == 0 || strcmp(cmd, "Client") == 0)
        RunClient();

不知何故。

编辑:

如果有人希望编译,这是代码。我仍然不知道如何解决

http://pastebin.com/8t8j63vj

最终编辑:

无法摆脱错误。决定简单地添加@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);
        ...
    }

并收工。

4

2 回答 2

3

fgets读取输入以及换行符。所以当你输入一个数字时,它就像:123\n.

atoi转换失败时不报告错误。

buffer从:中删除换行符

buf[5];
size_t length = strlen(buffer);
buffer[length - 1]=0;

然后用于strtol将字符串转换为数字,以便在转换失败时提供更好的错误检测。

于 2012-11-26T10:50:11.113 回答
1
char * fgets ( char * str, int num, FILE * stream );

从流中获取字符串。

从流中读取字符并将它们作为 C 字符串存储到str中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。

换行符使fgets停止读取,但它被函数视为有效字符并包含在复制到 str 的字符串中。(这意味着你携带\n)

在复制到 str 的字符之后会自动附加一个终止空字符。请注意,fgets 与 get 完全不同:fgets 不仅接受流参数,还允许指定 str 的最大大小,并在字符串中包含任何结束的换行符。

PD:尝试使用更大的缓冲区。

于 2012-11-26T10:53:52.110 回答