请帮助我在程序中找到错误

use*_*438 -3 c

我知道我发布的程序非常基本,但我无法找到错误.我重新检查了一切,但尽管没有编译错误,输出也没有到来.

#include<stdio.h>
#include <stdlib.h>
int main()
{
    int i;
    while(1)
    {
        if((scanf("%d",&i))!=42)
        {
            printf("%d",i);
        }
        else
        {
            break;
        }
    } 
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和考虑.

Jon*_*art 7

scanf不返回输入的值.它返回匹配的输入数量.所以42的检查是不正确的.如果分配了整数,它将返回1,如果i输入无效,则返回0.如果要在用户输入42时退出循环,则应明确进行测试if (i == 42).

正如simonc所提到的,你没有获得任何输出的原因是因为printf("%d",i);没有"\n"在数字后打印换行符,并且标准的out(stdout)流行缓冲的.这意味着标准库将继续缓冲您的printfs,直到遇到换行符.此时缓冲区将刷新到控制台.

解决方案是添加换行符(这可能是你想要的):printf("%d\n",i); 或者,您可以调用fflush(stdout)告诉std库立即将缓冲的内容刷新到控制台.或者,写入stderr将立即输出,因为它是无缓冲的.


这应该证明:

#include <stdio.h>

int main()
{
    int i;
    while(1) {
        fprintf(stderr, "Enter a number (or 42 to quit): ");
        if((scanf("%d",&i)) != 1) {
            fprintf(stderr, "Invalid input.\n");
            continue;
        }
        if (i==42)
            break;

        printf("Number provided: %d\n", i);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./a.exe
Enter a number (or 42 to quit): 17
Number provided: 17
Enter a number (or 42 to quit): 42
$ 
Run Code Online (Sandbox Code Playgroud)