#include<stdio.h>
int main()
{
int choice;
char sl[10];
char phn[10];
printf("Enter choice: ");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\nEnter Student Details: \n\n");
printf("\nEnter serial number: ");
gets(sl);
printf("Roll number: ");
gets(phn);
default:
break;
}
return 0;
}
C编程:
我在这里使用了2个gets()函数。第二个是工作但第一个不工作。为什么??如何让它发挥作用?
N.B:我想将“sl”和“phn”变量作为char类型,我想使用gets()来获取输入。 请有人帮忙......
答案 0 :(得分:2)
对所有输入使用fgets。 scanf通常在输入流中留下一个换行符,这会导致fgets出现问题。使用sscanf解析整数的输入并检查返回以确保输入整数。
#include <stdio.h>
int main()
{
int choice;
int result = 0;
char sl[10];
char phn[10];
char input[256];
do {
printf("Enter choice: ");
if ( ( fgets ( input, sizeof input, stdin))) {
result = sscanf( input, "%d", &choice);
if ( result == 0) {
printf ( "try again\n");
}
}
else {
fprintf ( stderr, "problem getting input\n");
return 1;
}
} while ( result != 1);
switch(choice)
{
case 1:
printf("\nEnter Student Details: \n\n");
printf("\nEnter serial number: ");
if ( ( fgets ( sl, sizeof sl, stdin)) == NULL) {
fprintf ( stderr, "problem getting serial number\n");
return 1;
}
printf("Roll number: ");
if ( ( fgets ( phn, sizeof phn, stdin)) == NULL) {
fprintf ( stderr, "problem getting roll number\n");
return 1;
}
break;
default:
break;
}
return 0;
}
答案 1 :(得分:0)
永远不要使用gets()
。它没有提供针对缓冲区溢出漏洞的保护(也就是说,您无法告诉它传递给它的缓冲区有多大,因此它无法阻止用户输入大于缓冲区和破坏内存的行)。
fgets()
是安全的,因为您可以保证永远不会通过传入缓冲区大小(包括NULL的空间)来溢出输入字符串缓冲区。
最重要的区别是fgets()
知道字符串有多大
是和gets()
没有。这意味着几乎不可能写
使用gets()
的安全代码,所以不要这样做。
使用fgets()
代替gets()