明白我的逻辑,而如果代码在C? 37行/空格的代码

明白我的逻辑,而如果代码在C? 37行/空格的代码

问题描述:

我写的代码基本上是一个关于要求用户输入名字的问题。如果名字是空白的,即用户忘记输入名字,那么代码会提到用户忘记输入名字,然后再询问。它应该继续询问,直到满足条件。明白我的逻辑,而如果代码在C? 37行/空格的代码

// This sample compares user input to what is being typed. If the 
// input is void of any charicters before pressing enter, it will print a reply. 

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

int main() 
{ 
    char firstname[25]; 

    printf("Please enter your first name:"); 
    fgets(firstname,25,stdin); 

    // ask to enter in a name. If no name or text is present, 
    // will reply with no name entered 
    // and will loop untill a name is pressed and entered 

    do 
    { 
     printf("You pressed enter before entering your first name.\n Please enter first name");    
    } 
    while (firstname == NULL || strcmp(firstname,"")==0); 

    if(!strcmp(firstname, "firstname")) 
    { 
     printf("Thank you %s! for entering in your first name",firstname); 
    } 

    getchar(); 
} 

它只循环一次。所以,不知道为什么它不会继续,并打破循环说"thank you %s! 任何人都可以给一个不同的例子,所以它的工作,我可以更好地理解它?

+0

它已经搞砸了! :)正确使用语法过滤器 – 2011-01-10 21:35:39

+1

保持缩进清晰!我已经写了近10年的代码,当你编写这样的代码时,我有一段不可能读的时间。如果一位经验丰富的程序员阅读这篇文章时遇到困难,那么是什么让你觉得你会更容易? – riwalk 2011-01-10 21:37:33

do...while循环中,只有一个printf语句不会更改循环的条件。考虑在循环内移动线fgets(firstname,25,stdin)

不太您遇到的问题,但它是一个你很快会遇到:

if(!strcmp(firstname, "firstname")) 

strcmp返回0,如果字符串相等的,如果它们是不同的返回正值或负值。

这意味着,如果你尝试解释结果作为布尔值,strcmp回报true当琴弦不同false时候都相同

你现在可以在引用的行上看到问题吗?

正如Blagovest Buyukliev所提到的,您需要将您的fgets移动到循环中。而且,fgets将在字符串中包含返回字符(请参阅here),因此将其与“”比较的调用不会像您期望的那样工作。

您可以将它与“\ n”进行比较。或者使用gets,它不包含换行符。

另外,真的没有理由检查NULL的名字,它是一个堆栈变量,并且永远不会为NULL。而且,最后你的printf只会在别人的名字字面上是“firstname”时执行,因为这就是你正在比较的。