#include <stdio.h>
int main(void)
{
   int i = 0;
   i = i++ + ++i;
   printf("%d\n", i); // 3
   i = 1;
   i = (i++);
   printf("%d\n", i); // 2 Should be 1, no ?
   volatile int u = 0;
   u = u++ + ++u;
   printf("%d\n", u); // 1
   u = 1;
   u = (u++);
   printf("%d\n", u); // 2 Should also be one, no ?
   register int v = 0;
   v = v++ + ++v;
   printf("%d\n", v); // 3 (Should be the …c increment operator-precedence undefined-behavior sequence-points
我经常看到人们不鼓励其他人使用scanf并说有更好的选择。但是,我最终看到的只是“不要使用scanf”或“这里是正确的格式字符串”,并且从来没有提到“更好的替代方案”的任何示例。
例如,让我们看一下这段代码:
scanf("%c", &c);
这将读取最后一次转换后留在输入流中的空白。通常建议的解决方案是使用:
scanf(" %c", &c);
还是不使用scanf。
由于scanf不好,用于转换scanf通常无需使用即可处理的输入格式(例如整数,浮点数和字符串)的ANSI C选项有哪些scanf?
我有以下程序:
int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2
  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4
  printf("Done"); // line 5
  system("PAUSE");
  return 0;
}
正如我在C书中读到的那样,作者说scanf()在缓冲区中留下了一个新的行字符,因此,程序不会在第4行停止供用户输入数据,而是将新行字符存储在c2中并移至第5行.
是对的吗?
但是,这只发生在char数据类型中吗?因为我没有int在第1,2,3行中看到数据类型的这个问题.是不是?
我有以下程序:
int main(int argc, char *argv[])
{
  char ch1, ch2;
  printf("Input the first character:"); // Line 1
  scanf("%c", &ch1); 
  printf("Input the second character:"); // Line 2
  ch2 = getchar();
  printf("ch1=%c, ASCII code = %d\n", ch1, ch1);
  printf("ch2=%c, ASCII code = %d\n", ch2, ch2);
  system("PAUSE");  
  return 0;
}
正如上面代码的作者所解释的那样:程序将无法正常工作,因为在第1行,当用户按下Enter时,它将在输入缓冲区中留下2个字符:Enter key (ASCII code 13)和\n (ASCII code 10).因此,在第2行,它将读取\n并且不会等待用户输入字符.
好的,我明白了.但我的第一个问题是:为什么第二个getchar()(ch2 = getchar();)不读取Enter key (13)而不是\n字符?
接下来,作者提出了两种解决此类问题的方法:
使用 fflush()
写一个这样的函数:
void
clear …我有一个小的C程序,它只是从stdin读取数字,每个循环周期一个.如果用户输入了一些NaN,则应该向控制台输出错误,输入提示应该再次返回.输入"0"时,循环应该结束,给定的正/负值的数量应该打印到控制台.这是程序:
#include <stdio.h>
int main()
{
    int number, p = 0, n = 0;
    while (1) {
        printf("-> ");
        if (scanf("%d", &number) == 0) {
            printf("Err...\n");
            continue;
        }
        if (number > 0) p++;
        else if (number < 0) n++;
        else break; /* 0 given */
    }
    printf("Read %d positive and %d negative numbers\n", p, n);
    return 0;
}
我的问题是,在输入一些非数字(如"a")时,这会导致无限循环一遍又一遍地写" - > Err ...".我想这是一个scanf()问题,我知道这个函数可以被更安全的替换,但这个例子适用于初学者,只知道printf/scanf,if-else和循环.
我已经阅读了这个问题的答案并浏览了其他问题,但没有真正回答这个具体问题.
我有以下程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
   char ans[8];
    int i;
    for(i=1;i<=3;i++)
    {
        printf("\n What is the unit of traffic ?");
        scanf("%s",ans);
        fflush(stdin);
        if(stricmp(ans,"Earlang")==0)
        {
            printf("\nAnswer is correct");
            exit(1);
        }
        else
            if(i<3)
            printf("\n Try Again!\n");
    }
    printf("\n Nunit of traffic is Earlang:");
}
fflush(stdin)在这个程序中有什么用?
我是C编程的新手,我正在努力了解它是如何fflush(stdin)工作的.
在下面的示例中,是否fflush(stdin)清除所有缓冲区或清除在第三个项目后输入的内容?我的意思是用户输入帐号,空格,名称,空格,余额.这是真的,从这一点开始,用户输入的内容将被刷新fflush(stdin)吗?并且stdin不会是空的.
为什么我这样说是因为它进入了while循环并开始写入文本文件.
我的第二个问题是是否Ctrl-Z会告诉操作系统停止要求用户输入输入?
printf( "Enter the account name and balance. (separated by spaces)\n" );
  printf( "Enter EOF to end input. (Ctrl-Z)\n" );
  printf( "? " );
  scanf( "%d%s%lf", &account, name, &balance );
  fflush(stdin);
  // write account, name and balance into file with fprintf
  while ( !feof( stdin ) )
  { 
     //fflush(stdin);
     fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
     printf( "? " );
     scanf( "%d%s%lf", &account, name, &balance …有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?
我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.
我知道大多数终端默认处于行缓冲模式.即输出被缓冲,并且在遇到换行字符之前不会被引导到stdout.
所以我希望它什么都不打印(至少在填充缓冲区之前):
int main() {
    while(1) {
        printf("Haha");
        sleep(1);
    }
    return 0;
}
它确实在很短的时间内打印出来.
如果我想每秒打印"哈哈",我可以在printf之后printf("Haha\n")或者fflush(stdout)之后做.(我知道这不是那么便携,但它仍然是一个解决方案)
现在我回想起非常经典的scanf程序(我添加了while(1)循环以防止程序退出时缓冲区刷新):
int main() {
    char char_in;
    while(1) {
        printf("Haha. Input sth here: ");
        scanf("%c", &char_in);
    }
    return 0;
}
现在程序打印Haha. Input sth here:(并等待我的输入).如果我删除scanf语句,它不在这里.为什么会这样?
谢谢.