如何从fgets中检测空字符串

KWJ*_*104 5 c input fgets

我试图将stdin的fgets输入检测为空(当我按下enter而不输入任何内容时).这是我的计划:

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

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

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

我想做某种条件,使它不打印任何东西,但显然这种方式是不对的.我也试过NULL,这没用.

谢谢!

orl*_*rlp 7

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

if (strlen(input) != 0) {
    printf("hi");
}
Run Code Online (Sandbox Code Playgroud)

但是为了教学,这里是你的风格,但随后修复:

if (input[0] != '\0') {
    printf("hi");
}
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*fin 5

明显的方法是这样的:

if (input[0] != '\0')
   printf("hi");
Run Code Online (Sandbox Code Playgroud)

尽管 usingstrlen 可以工作,但它可能相当浪费——它将 O(1) 操作变成了 O(N) 操作。

当然,您几乎总是希望首先检查返回值fgets。然后,如果它说它成功读取了某些内容,则您检查内容以确保它不为空。

这是一个捕捉大部分可能发生的情况的快速演示:

if (input[0] != '\0')
   printf("hi");
Run Code Online (Sandbox Code Playgroud)

[注意:我已将输入大小从 1000 个字符缩短到仅 10 个字符,因此很容易看到当您输入的输入内容多于允许fgets阅读的内容时会发生什么情况。]

  • 如果您按(仅)ctrl+ d(Linux)或F6(Windows),您应该收到“fgets failed”消息。
  • 如果您只按Enter,您应该会收到“空输入”消息。
  • 如果您输入的字符串少于 10 个字符,您应该会看到“正在删除换行符”,然后显示您输入的字符串。
  • 如果您输入 10 个或更多字符的字符串,则应该显示您输入的字符串的前 9 个字符(但不会显示“正在删除换行符”消息)。