了解我的逻辑,如果在c中的代码吗? 37行/代码空间

时间:2011-01-10 21:32:56

标签: c

我写的代码基本上是一个关于要求用户输入名字的问题。如果名称为空白,即用户忘记输入名字,则代码会提到用户忘记输入名称,然后再次询问。它应该继续询问,直到满足条件。

// 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! 任何人都可以给出一个不同的例子,它确实有效,我可以更好地理解它吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

不是你遇到的问题,但这是你很快就会遇到的问题:

if(!strcmp(firstname, "firstname")) 
如果字符串相等,

strcmp返回0,如果它们不同,则返回正值或负值。

这意味着如果您尝试将结果解释为布尔值,strcmp会在字符串不同时返回true,而false则为{{1}} 相同

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

答案 2 :(得分:0)

正如Blagovest Buyukliev所提到的,你需要将你的fgets移动到循环中。但是,fgets将在字符串中包含返回字符(请参阅here),因此将其与“”进行比较的调用将无法正常工作。

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

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