关于scanf:C编程-为什么gets()不接受输入?

C programming--why gets() not taking input?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
int main()
{
   int choice;
   char sl[10];
   char phn[10];
   printf("Enter choice:");
   scanf("%d",&choice);
   switch(choice)
   {
   case 1:
       printf("\
Enter Student Details: \
\
"
);
       printf("\
Enter serial number:"
);
       gets(sl);
       printf("Roll number:");
       gets(phn);
   default:
      break;
   }
   return 0;
}

C编程:

我在这里使用了2个gets()函数。第二个工作,但第一个不工作。为什么??如何使其工作?

N.B:我想将" sl"和" phn"变量作为char类型,并且我想使用gets()进行输入。
请有人帮忙....


将fgets用于所有输入。 scanf通常在输入流中留下换行符,这将导致fgets问题。使用sscanf解析输入的整数,并检查返回值以确保输入了整数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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\
"
);
            }
        }
        else {
            fprintf ( stderr,"problem getting input\
"
);
            return 1;
        }
    } while ( result != 1);
    switch(choice)
    {
        case 1:
            printf("\
Enter Student Details: \
\
"
);
            printf("\
Enter serial number:"
);
            if ( ( fgets ( sl, sizeof sl, stdin)) == NULL) {
                fprintf ( stderr,"problem getting serial number\
"
);
                return 1;
            }
            printf("Roll number:");
            if ( ( fgets ( phn, sizeof phn, stdin)) == NULL) {
                fprintf ( stderr,"problem getting roll number\
"
);
                return 1;
            }
            break;
        default:
            break;
    }
    return 0;
}

请勿使用gets()。它没有提供针对缓冲区溢出漏洞的保护措施(也就是说,您不能告诉它传递给它的缓冲区有多大,因此它不能阻止用户输入比缓冲区大的行并破坏内存)。

fgets()是安全的,因为您可以通过传递缓冲区大小(其中包括NULL的空间)来保证您不会溢出输入字符串缓冲区。

最重要的区别是fgets()知道字符串的大小
是,gets()不是。这意味着几乎不可能写
使用gets()的安全代码,请不要这样做。

在其中使用fgets()而不是gets()