C 获取()导致输出错误
由于gets()…导致输出错误,如图中所示。。。程序在等待用户输入字符串之前打印0。我需要读取“click X”格式的字符串,其中X是一个整数。在这种情况下,是否可以使用gets()的替代方法C 获取()导致输出错误,c,gets,C,Gets,由于gets()…导致输出错误,如图中所示。。。程序在等待用户输入字符串之前打印0。我需要读取“click X”格式的字符串,其中X是一个整数。在这种情况下,是否可以使用gets()的替代方法 #include<stdio.h> #include<stdlib.h> int main() { int n,k,i; char action[10]; int *open; scanf("%d%d",&n,&k);
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,k,i;
char action[10];
int *open;
scanf("%d%d",&n,&k);
open= calloc( sizeof(int),n);
for(i=0;i<n;i++)
{
open[i]=0;
}
for(i=0;i<k;i++)
{
//gets to read an input as "click 1"
gets(action);
printf("%d\t%c",i,action[6]);
}
free(open);
return 0;
}
#包括
#包括
int main()
{
int n,k,i;
炭作用[10];
int*开放;
scanf(“%d%d”、&n和&k);
open=calloc(sizeof(int),n);
对于使用“scanf”后的(i=0;i)
getchar();
使用额外的换行符。由于“scanf”不能丢弃换行符,“get”的第一次迭代使用换行符
不要使用“get”,而是使用“fgets”
您可以将“fgets()”用作
您的操作
可能声明太短。请重试
char action[64];
相反
然后替换
gets(action); /// BAD CODE
与
您应该永远不要使用gets
,它已经过时了
(使用fflush
刷新输出缓冲区;memset
正在清除action
缓冲区;fgets
正在从stdin
读取最多63个字节,因此您可以确定action
结束时将像每个C字符串一样以空字节结束)
您应该要求编译器提供所有警告和调试信息,例如,如果使用,请使用gcc-std=c99-Wall-Wextra-g
您应该学会使用调试器(例如gdb
)请不要发布文本图像。请复制粘贴。好的……谢谢你的建议。你能详细说明吗?详细说明什么?你阅读了链接问题的所有答案了吗?我明白你的意思。这种情况下还有其他选择吗?是的,但没有回答问题。如何使用fgets()在这种情况下,因为我没有使用任何文件流?是的,它解决了可能需要额外消耗的问题newline@interjay,答案已编辑。这里的问题是获取
呼叫根本不要求用户输入。切换到fgets
不会改变这一点。阅读重复的问题会改变这一点。你为什么要从sizeof(操作)中扣除1@粉碎者:我的错误,更正了!
gets(action); /// BAD CODE
fflush (NULL);
memset (action, 0, sizeof(action));
fgets (action, sizeof(action), stdin);