c程序绕过gets()

时间:2016-06-08 19:03:52

标签: c string gets

#include<stdio.h>
int main()
{
int N,i,j,n,*numArray,count=0;
char **arr,*part1,*part2,*token;
scanf("%d",&N);
arr=(char **)malloc(N*sizeof(char *));
numArray=(int *)malloc(N*sizeof(int));
for(i=0;i<N;i++){
arr[i]=(char *)malloc(50*sizeof(char));
}

for(i=0;i<N;i++){
printf("plz enter %d th :",i);
    gets(&arr[i][0]);// why is it not executing

}

for(i=0;i<N;i++){
 printf("%s",arr[i]);
}
return 0;
}

我尝试执行此代码并发现该行得到(&amp; arr [i] [0]);没有执行,即它不等待用户输入。相反,它打印“plz输入0 th:plz输入1 th:plz输入2 th:依此类推”并且不等待用户输入字符串。 我无法得到究竟是什么问题以及到底发生了什么?请帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

此行输入条目数

scanf("%d",&N);

在输入缓冲区中留下newline。然后这一行

gets(&arr[i][0]);

将单独的newline作为第一个条目。

你可以像这样摆脱它

scanf("%d%*c",&N);

但是你不应该在这个时代使用gets,它已经过时了。这对于字符串条目(而不是上面的mod)来说会更好

scanf("%50s", arr[i]);

以及检查所有scanf次调用的返回值。但是代码仍然需要改进,因为如上所述,scanf只能扫描到第一个空格。

答案 1 :(得分:2)

  

。它不等待用户输入。相反,它打印“plz输入0   th:plz输入第1个:plz输入第2个:依此类推“

这是由于循环中出现空格的问题...而是在每次使用scanf(" ");扫描字符串之前尝试使用它们,如下所示:

for(i=0;i<N;i++){
printf("plz enter %d th :",i);
    scanf(" "); //to consume white spaces
    gets(arr[i]);// why is it not executing? because of wrong arguments

}

编辑根据@ user3629249的建议

  

从不使用gets()有两个主要原因:

     
      
  1. 它允许输入溢出输入缓冲区
  2.   
  3. 从C11开始,它将从语言中删除。
  4.   

更好的选择是fgets()

这是一个更了解它的链接:here