C编程 - 为什么得到()不接受输入?

时间:2017-04-02 17:13:13

标签: c scanf

#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()来获取输入。 请有人帮忙......

2 个答案:

答案 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()