【问题标题】:Accepting empty strings in C在 C 中接受空字符串
【发布时间】:2015-12-13 01:43:37
【问题描述】:

我的程序可以接受任意长度的数字或空输入。但是,如果输入为空(空格或换行符),程序将继续等待输入。我也尝试过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查看原始代码。

【问题讨论】:

  • 意思是,是否要忽略空输入(空格或换行符)?
  • 如果你没有输入这段代码输出0,是你的愿望吗?
  • scanf 无法按预期工作,因为%d 跳过了前导空白字符。
  • 我切换到 fgets() 并且它有效。我编译代码错误,所以程序在我第一次尝试时仍在使用 scanf。
  • 使用 scanf() 和 fgets(),始终检查返回值(不是参数值)以确保操作成功

标签: c input


【解决方案1】:

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

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

【讨论】:

  • ch 应该是一个int,因为getchar 返回一个int
【解决方案2】:

根据scanf()的定义

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

所以你不能使用scanf() 得到你想要的结果。 因为 gets() 不安全,而且行为不端。如果需要,可以使用fgets() 获取输入并将其转换为整数。使用atoi()

你可以试试这里的示例代码:

#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);
    }
}

【讨论】:

  • 这是个坏主意。 Don't ever use gets().
  • @Enzo Ferber 请澄清“在类型格式之前需要一个空格以忽略空格”。当然scanf(" %d", ...)scanf("%d", ...)同样扫描int
  • @chux 是的,我以为我已经删除了。
【解决方案3】:

我也尝试过 fgets,但如果按下空格/换行符,它仍会等待更多输入,而不是空格/换行符,然后再关闭。

首先fgets 将在这种情况下工作。如果您已经向我们展示了您使用fgets() 尝试做什么,那么对这个问题的回答将非常狭窄或非常具体。

我尝试使用fgets() 做同样的事情,下面是代码 sn-p。

#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() 不会等到您输入有效数字。

同时检查一下为什么你不应该使用getsDo not use gets()

【讨论】:

  • 我之前尝试过这样的代码。我只是没有意识到新代码没有被编译:(谢谢你的帮助!它有效!
  • string[strlen(string) - 1] = '\0'; 在没有'\n' 时错误地截断。如果第一个字符是罕见的嵌入 '\0',则这是未定义的行为。最好使用stackoverflow.com/a/28462221/2410359
  • 关于这一行:string[strlen(string) - 1] = '\0'; 这在所有情况下都不能正常工作,原因有两个。 1)如chux所述,如果没有换行符,则该行将被破坏。 2)如果在windows/dos下运行,(换行实际上是两个字符)这不会删除换行,只会破坏它。建议使用类似:char * offset = strstr( string, "\n" ); if (NULL != offset) *offset = '\0';
  • @user3629249:同意。谢谢
【解决方案4】:

好吧,你不明白 scanf() 是做什么的,它会扫描整个输入字符串并查找特殊字符,如 %d、%f、%s,直到它没有得到字符串中的内容,它才会等待。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多