2011-11-08 72 views
2

我试图检测从标准输入的fgets输入为空(当我按下输入而不输入任何内容)。这里是我的程序:如何检测fgets的空字符串

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

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

    return 0; 

} 

我想做一些条件,使它不打印任何东西,但显然这种方式是不正确的。我也试过NULL,这没有奏效。

谢谢!

+0

@JamesMcNellis事实上,该行不会做任何事情,无论在哪里'input'是从哪里来的。 'strlen'函数只是搜索字符串中的第一个''\ 0',所以按照定义'input [strlen(input) - 1] =='\ 0''。它可能改变的唯一情况是引入一个段错误,如果'input'不是空终止的,并且在用完程序的地址空间之前不会发生任何''\ 0''。 –

回答

6

我觉得这是最可读的(但不是高性能的):

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

但这里教学的目的是你的风格,但后来修正:

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

为什么input[0]?因为input的行为类似于指向数组第一个元素的指针,所以如果您将它比较,并且首先必须对其进行取消引用以使比较有用。

+0

+1,但'input'是一个数组,不是指向数组的指针。它在这种比较的背景下确实衰减为指针,但重要的是要做出区分。 –

+0

@Carl Norum:Woops,我编辑了它。 – orlp

+0

是的,但你编辑为相同(错误)的陈述。数组和指针并不是一回事,即使它们恰好在这个特定情况下可以互换使用。 –

2

最显而易见的方法是这样的:

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

虽然使用strlen工作,这是潜在的相当浪费 - 它原来的O(1)操作为O(N)。

2

当按下回车键时,fgets将返回'\ n';这使得总字符串“\ n \ 0”。你可以用这个值进行字符串比较,但更强大的解决方法是“去除”或“修剪”字符串以删除所有前导和尾随空白(在进行任何处理之前,您应该执行任何操作),然后检查空字符串。

最简单的修改是检查是否(*input!='\n')。我应该注意到,这也需要你删除空终止的代码,这可以去掉这个换行符(据推测,这是设计)。

1

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

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