C:你如何处理scanf没有用户输入?

时间:2016-02-01 15:23:43

标签: c exception-handling user-input scanf

亲爱的Stackoverflowers,

你如何处理0个用户输入?

例如,如果用户输入" "或者只按ENTER键,你如何处理?

#include <stdio.h>
#include <string.h>

int main() {

   printf("> \n");
   char string[129];
   int i = 0, length = 0, flag = 0;

   printf("Input a string: ");
   scanf("%128s", string);
   if(strlen(string) != 0) {
      printf("%s\n", string);
   } else {
      printf("Please enter at least one argument.");
   }
}

2 个答案:

答案 0 :(得分:2)

引用C11,章节§7.21.6.2,fscanf(),关于%s转换说明符,

  

s匹配一系列非空白字符。

并且关于执行转换说明符的步骤

  

除非是跳过输入的空白​​字符(由isspace函数指定)   该规范包括[cn说明符。

因此,除非输入流中存在非空白字符,否则它将等待。 匹配将不会发生。

此外,检查scanf()和系列的返回值非常重要,以确保扫描成功。

尽管如此,int main()至少应该int main(void)符合标准。

答案 1 :(得分:1)

scanf()实现这一点可能是不可能的,我没有兴趣找出是否可能,因为这个解决方案

#include <stdio.h> /* For fgets(), fprintf() and printf() */
#include <stdlib.h> /* For EXIT_FAILURE */
#include <ctype.h> /* For isspace() */

int
please_enter_at_least_one_argument()
{
    fprintf(stderr, "Please enter at least one argument\n");
    return EXIT_FAILURE;
}

int
main(void)
{
    char string[130];

    printf("> \n");
    printf("Input a string: ");
    if (fgets(string, sizeof(string), stdin) == NULL)
        return please_enter_at_least_one_argument();
    else
    {
        char *pointer;

        pointer = string;
        while (isspace((unsigned char) *pointer) != 0)
            pointer++;
        if (*pointer == '\0')
            return please_enter_at_least_one_argument();
        printf("%s\n", string);
    }
    return 0;
}

解决问题并且很容易理解。

请注意,第一个please_enter_at_least_one_argument()可能不正确,因为如果按 Ctrl + D fgets()可能会返回NULL或在Windows Ctrl + Z )以及发生错误时。但要了解如何处理,您应该阅读man fgets(3)