C语言 如何从fgets中检测空字符串

7z5jn7bk  于 2023-04-11  发布在  其他
关注(0)|答案(4)|浏览(183)

我试图检测从stdin输入的fgets为空(当我按回车键而没有输入任何东西时)。下面是我的程序:

int main()
{
    char input[1000];
    printf("Enter :");
    fgets(input, 1000, stdin);
    input[strlen(input) - 1] = '\0';

    if(input != '\0'){
        printf("hi");
    }

    return 0;

}

我想做一些条件,使它不打印任何东西,但显然这种方式是不正确的。
谢谢!

cnh2zyt3

cnh2zyt31#

我认为这是最具可读性的(但不是性能):

if (strlen(input) != 0) {
    printf("hi");
}

但为了教学起见这里是你的风格,但随后固定:

if (input[0] != '\0') {
    printf("hi");
}

为什么是input[0]?因为input的作用就像一个指针,指向数组的第一个元素,如果你像这样比较它,你首先必须取消引用它,使比较有用。

erhoui1w

erhoui1w2#

最明显的方式是这样的:

if (input[0] != '\0')
   printf("hi");

虽然使用strlen * 将 * 工作,但它可能非常浪费-它将O(1)操作变成O(N)。
当然,您几乎总是希望首先检查fgets的返回值,然后如果它说它成功阅读了某些内容,则检查内容以确保它不是空的。
下面是一个快速演示,可以捕捉到大部分可能发生的事情:

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

int main()
{
    char input[10];
    printf("Enter :");
    if (!fgets(input, sizeof(input), stdin)) {
        printf("fgets failed\n");
        return 0;
    }
    char *pos = strchr(input, '\n');
    if (pos != NULL) {
        printf("Removing new-line\n");
        *pos = '\0';
    }

    if(input[0] == '\0') {
        printf("empty input");
    } else {
        printf("Read input: \"%s\"", input);
    }
    return 0;
}

[Note:我已经将输入大小从1000缩短到只有10个字符,因此很容易看到当输入的内容超过fgets允许读取的内容时会发生什么。]

  • 如果您只按ctrl+d(Linux)或F6(Windows),您应该会看到“fgets failed”消息。
  • 如果你只是按Enter键,你应该得到“空输入”的消息。
  • 如果您输入的字符串少于10个字符,您应该得到“删除新行”,然后显示您输入的字符串。
  • 如果您输入了一个包含10个或更多字符的字符串,则应该显示所输入字符串的前9个字符(但不会显示“删除新行”消息)。
bihw5rsg

bihw5rsg3#

fgets将返回一个'\n'当回车键被按下;这使得总字符串为“\n\0”。您可以使用此值进行字符串比较,但更可靠的解决方案是'strip'或'trim'字符串以删除所有前导和尾随空格(无论如何,您都应该在任何处理之前执行此操作),然后检查是否为空字符串。
最简单的修改是检查是否为(*input!='\n')。我应该注意到,这还需要您删除空终止代码,这会去掉这个换行符(大概是设计好的)。

x9ybnkn6

x9ybnkn64#

为了安全起见,最好使用这个:

if(u_input[0] == '\n' && u_input[1] == '\0'){
    printf("hi");
}

相关问题