我经常看到人们不鼓励其他人使用scanf并说有更好的选择。但是,我最终看到的只是“不要使用scanf”或“这里是正确的格式字符串”,并且从来没有提到“更好的替代方案”的任何示例。
例如,让我们看一下这段代码:
scanf("%c", &c);
Run Code Online (Sandbox Code Playgroud)
这将读取最后一次转换后留在输入流中的空白。通常建议的解决方案是使用:
scanf(" %c", &c);
Run Code Online (Sandbox Code Playgroud)
还是不使用scanf。
由于scanf不好,用于转换scanf通常无需使用即可处理的输入格式(例如整数,浮点数和字符串)的ANSI C选项有哪些scanf?
因此,谷歌快速搜索fflush(stdin)清除输入缓冲区会发现许多网站警告不要使用它.然而,这正是我的CS教授教授课程的原因.
使用有多糟糕fflush(stdin)?即使我的教授正在使用它并且似乎完美无缺地工作,我是否真的应该放弃使用它?
我想知道如何在C++中模拟一个关键的抑郁症.如有代码,当我运行程序时,它按下字母"W"键.我不想在控制台窗口中显示它我只想在每次单击文本字段时显示"W"键.谢谢!
注意:我不是想制作垃圾邮件发送者.
如何刷新stdin?
为什么它不能在以下代码片段中工作?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main()
{
int i=0,j=0, sat;
char arg[256];
char * argq;
argq = malloc(sizeof(char)*10);
printf("Input the line\n");
i=read(0, arg, sizeof(char)*9);
arg[i-1]='\0';
fflush(stdin);
i=read(0, argq, sizeof(char)*5);
argq[i-1]='\0';
puts(arg);
puts(argq);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我将输入作为11个字符,则只应读取9个,但是stdin中剩余的两个字符不会被刷新并在argq中再次读取.为什么?
输入:123 456 789
产出:123 456 89
为什么我将这89作为输出?
我在Linux GCC中使用了fflush()但它没有用.该功能有其他替代方案吗?这是我的代码:
#include<stdio.h>
void main()
{
char ch='y';
while(ch=='y')
{
int a;
printf("Enter some value:");
scanf("%d",&a);
fflush(stdin);
printf("Do you want to continue?");
scanf("%c",&ch)
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
Enter some value: 10
Run Code Online (Sandbox Code Playgroud)
然后程序结束.就这样.我在Linux中可以做什么?有替代功能吗?
我已经找到了while((c = getchar()) != '\n' && c != EOF)在这里使用清除stdin 几次的例子,并尝试在通过fgets获取输入的循环中使用它.我需要刷新,因为循环从最后一个输入获取\n字符并再次运行它.
那么现在发生的是我现在必须按两次输入.为什么会发生这种情况,我该如何解决这个问题呢?
#define BUFFER_LIMIT 50
do
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
printf("console> ");
fgets(input_buffer, BUFFER_LIMIT-1, stdin);
if(do_something(input_buffer))
break;
} while(strncmp(input_buffer, "quit", 4) != 0);
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 C 程序,我需要等待用户按任意键才能继续。当我使用getchar();它时,它等待Enter按键被按下。但是当我在while循环中使用它时,它不起作用。如何让我的代码等待按下任意键才能继续循环?
这是我的代码示例。我正在使用 GNU/Linux。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int choice;
while(1) {
printf("1.Create Train\n");
printf("2.Display Train\n");
printf("3.Insert Bogie into Train\n");
printf("4.Remove Bogie from Train\n");
printf("5.Search Bogie into Train\n");
printf("6.Reverse the Train\n");
printf("7.Exit");
printf("\nEnter Your choice : ");
fflush(stdin);
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("Train Created.");
break;
case 2:
printf("Train Displayed.");
break;
case 7:
exit(1);
default:
printf("Invalid Input!!!\n");
}
printf("Press [Enter] key to continue.\n");
getchar();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 程序说明: - 我编写了一个程序,该程序从用户输入无限的字符输入.时间并打印输入的输入.这是程序
#include<stdio.h>
int main()
{
int i=1;
char a;
while (i!=0)
{
printf("Enter %d th value\n",i);
scanf("%c",&a);
printf("Entered input is %c\n",a);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
上述方案的产出: -
Enter 1 th value
q
Entered input is q
Enter 2 th value
Entered input is
Enter 3 th value
r
Entered input is r
Enter 4 th value
Entered input is
Enter 5 th value
g
Entered input is g
Enter 6 th value
Entered input is
Enter 7 th value …Run Code Online (Sandbox Code Playgroud) 我如何从控制台中的用户输入中读取恰好 50 个字符(49,+1 表示空),仅忽略所有初始空格(如第一个单词之前),但保留其后的 49 个字符,包括所有空格?
另外,如果用户输入少于 49 个字符并输入换行符,它只会处理该内容(换行符之前的所有内容都会忽略初始空格)。
我尝试使用:
char name[50];
scanf("%49s",name);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎忽略了所有空白;所以,如果我的名字是这样的:“Mark Smith”,它将无法正确处理。
对于一个简单的程序,分配是创建一个接受十位数电话号码的程序,然后将其读回给用户.需要进行控制以确保:
第一个数字不是0.
输入的数字是十个数字.
错误检查似乎很简单; 我想使用while循环来确保数字的范围在1000000000和9999999999之间可以解决,并且根据独立的计算,它似乎应该.
while ((MDN - valueCheck < 0) || (MDN > 9999999999)) {
printf("Entered number is not ten digits. Please re-enter.\n");
scanf("%d", &MDN);
}
Run Code Online (Sandbox Code Playgroud)
这两个MDN和valueCheck是long long类型变量(这样的范围内可以走过去2,147,483,647; IIRC很长很长为64位),但他们似乎仍然被列为32位整数,如进入2147483647出来就好了(或者更低的电话号码作品同样),但输入2,147,483,648(或以上任何内容)会使其显示为-2147483647.
与上述相关,输入一个更高的数字,不仅值环绕32位整数的范围,而且printf循环后语句打印的电话号码总是等于输入的数字减去两倍的限制32位整数.
是否有任何简单的方法使程序实际工作在64位数字,就像我想要的那样?如果我可以使数学正常工作,该算法似乎很可靠.