接受C中的空字符串

时间:2015-09-16 12:51:33

标签: c input

我的程序可以接受任意长度或空输入。但是,如果输入为空(空格或换行符),程序将继续等待输入。我也尝试了fgets但是如果按下空格/换行符,它仍然会在关闭之前等待更多不是空格/换行符的输入。

简化代码:

#include <stdio.h>
main()
{
    int num;
    scanf("%i",&num);
    printf("%i",num);
}

输入:

363792 

输出:

363792

渴望:

输入:

输出:

我是 C 的新手,我很难完成这项工作。

尝试使用fgets:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    int n;
    char s[20];

    fgets(s,20,stdin);
    n = atoi(s);

    printf("%i",n);
}

编辑:原来我没有正确编译代码。因此每次我尝试进行更改时,只需使用scanf查看原始代码。

4 个答案:

答案 0 :(得分:22)

  

我也尝试了fgets但是如果按下空格/换行符,它仍然会在关闭之前等待更多不是空格/换行符的输入。

首先fgets将适用于此案例。如果您向我们展示了您使用fgets()确切尝试做什么,那么对此问题的回答将会非常狭隘或非常具体。

我尝试使用fgets()执行相同操作,以下是代码段。

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

int main(int argc, char *argv[])
{  
    char string[100];
    printf("Enter a number: ");

    fgets (string, 100, stdin);
    /* Here remove  the trailing new line char; not required unless you are trying to print the string */
    string[strlen(string) - 1] = '\0';

    printf("Num is %d\n", atoi(string));

    return 0;
}

如果没有输入或只输入或空格并输入,则打印的数字将为零,fgets()将不会等到您输入有效数字。

另请查看不应使用获取的原因。 Do not use gets()

答案 1 :(得分:9)

根据scanf()

的定义
  

该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符。

因此,您无法使用scanf()获得所需的结果。 由于获取()不安全而且行为不当。如果您需要使用atoi(),可以使用fgets()获取输入并将其转换为整数。

您可以尝试以下示例代码:

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
    int num;
    char ch[100];
    fgets(ch, sizeof ch, stdin);
    if (strlen(ch)>1&& ch[strlen(ch)-1] == '\n')
    {
        ch[strlen(ch)-1] = '\0';
        num = atoi(ch);
        printf("%i\n", num);
    }
}

答案 2 :(得分:6)

您应该逐个读取输入字符,如果读取的字符不是数字,则停止读取:

char ch;
while(1)
{
    ch=getchar();
    if(isdigit(ch))
    {
        putchar(ch);
    }
    else
    {
        break;
    }
}

答案 3 :(得分:2)

好吧,你不明白scanf()的作用,它会扫描整个输入字符串并查找特殊字符,如%d,%f,%s,直到它没有得到它将等待的字符串。

scanf("%d %d", a, b);

只有在输入2个整数值时才会完成,如果你按空格它不算作整数值,所以它会忽略它。