C 获取()导致输出错误

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);

由于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);                                    
    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);