c 程序正在绕过 gets()
c program is bypassing 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;
}
我尝试执行这段代码,发现该行 gets(&arr[i][0]);不会被执行,即它不会等待用户输入。相反,它打印 "plz enter 0 th: plz enter 1 th: plz enter 2 th: and so on" 并且不等待用户输入字符串。
我无法弄清楚到底出了什么问题,到底发生了什么?请帮助。提前致谢。
这一行输入条目数
scanf("%d",&N);
在输入缓冲区中留下 newline
。然后这一行
gets(&arr[i][0]);
将单独的 newline
作为第一个条目。
你可以这样去掉它
scanf("%d%*c",&N);
但是你不应该在这个时代使用 gets
,它已经过时了。这对于字符串条目来说会更好(而不是上面的mod)
scanf("%50s", arr[i]);
以及检查来自所有 scanf
调用的 return 值。代码仍然需要改进,因为如上所述 scanf
只会扫描到第一个空格。
. it doesn't wait for user to input. Instead, it prints "plz enter 0
th: plz enter 1 th: plz enter 2 th: and so on"
这是由于循环中 white space 的问题...而不是在每次使用 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
所建议
Never use gets()
for two major reasons:
- It allows the input to overflow the input buffer
- It is removed from the language from C11 onward.
更好的选择是 fgets()
这里是 link 以了解更多信息:here
#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;
}
我尝试执行这段代码,发现该行 gets(&arr[i][0]);不会被执行,即它不会等待用户输入。相反,它打印 "plz enter 0 th: plz enter 1 th: plz enter 2 th: and so on" 并且不等待用户输入字符串。 我无法弄清楚到底出了什么问题,到底发生了什么?请帮助。提前致谢。
这一行输入条目数
scanf("%d",&N);
在输入缓冲区中留下 newline
。然后这一行
gets(&arr[i][0]);
将单独的 newline
作为第一个条目。
你可以这样去掉它
scanf("%d%*c",&N);
但是你不应该在这个时代使用 gets
,它已经过时了。这对于字符串条目来说会更好(而不是上面的mod)
scanf("%50s", arr[i]);
以及检查来自所有 scanf
调用的 return 值。代码仍然需要改进,因为如上所述 scanf
只会扫描到第一个空格。
. it doesn't wait for user to input. Instead, it prints "plz enter 0 th: plz enter 1 th: plz enter 2 th: and so on"
这是由于循环中 white space 的问题...而不是在每次使用 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
所建议Never use
gets()
for two major reasons:
- It allows the input to overflow the input buffer
- It is removed from the language from C11 onward.
更好的选择是 fgets()
这里是 link 以了解更多信息:here