首页 文章

Strcmp()在“系列”中[重复]

提问于
浏览
1

这个问题在这里已有答案:

我想比较一些字符串,但不幸的是我没有找到任何正确的方法来做到这一点 .

背后的想法是要求键盘输入,读取变量,一个符号,如果它是“y”或“n”(显然是“是”或“否”),它执行某些活动 . 如果char的值都不是它们,则再次询问该问题,直到没有按下“y”或“n” . 我不明白如何实现这一点 .

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

int main()
{
    char answer;

    answer='a';

    while (answer!='n'&&answer!='y')

    {

        printf("\nQuestion? (y/n) ");
        scanf("%c",&answer);

    }

    return 0;
}

这实际上非常好用,但如果我不按'y'或'n',“while”再次启动,由于我无法理解的原因,“printf”执行的次数比输入 . 因此,如果我们运行此代码并将“asdf”作为输入(四个符号)应用,则“while”中的“printf”将显示五(四加一)次 . 结果是:

Question? (y/n)
Question? (y/n)
Question? (y/n)
Question? (y/n)
Question? (y/n)

其他一切在我的代码中工作得非常好,但是这......显然,这不是最好的方法 . 我也试过“strcmp()”:

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

int main()
{
    char answer='a';

    while (strcmp(answer,'n')!=0&&strcmp(answer,'y')!=0)

    {

        printf("Question?");
        scanf("%c",&answer);

    }

    return 0;
}

我不知道为什么,但程序甚至没有开始 . 很明显,我没有正确实施“strcmp”,我不明白有什么不对 .

任何想法,我该怎么做,所以我可以避免在“while”中多次执行“printf”或者让“strcmp”以我要求的方式工作?

3 回答

  • 1

    您可能想要读取整行,并将其解释为整体 . 这样,当您输入包含多个字符的行时,您不会获得额外的不需要的迭代,也不会为换行符添加额外的迭代 . 看看 fgets() 函数 .

    除了非常简单的输入要求之外, scanf() 通常是一个糟糕的选择,正是因为它有些模糊,并且在解析之前不允许您验证部分输入 .

  • 1

    scanf%c 格式说明符将读取任何字符,包括空格字符(如换行符) .

    因此,如果您输入一个字母并按ENTER键, scanf 将读取该字母并返回,将换行符保留在输入缓冲区中 . 在循环的下一次迭代中, scanf 将立即消耗缓冲区中剩余的换行符, answer 将包含换行符 . 's why you'看到提示打印两次 .

    您需要以 scanf 格式添加前导空格:

    scanf(" %c",&answer);
    

    该空间将使用输入的任何空白字符,以便 answer 仅包含非空格 .

    您遇到 strcmp 问题的原因是因为您实际上并不比较字符串而是单个字符 . strcmp 的每个参数都应该是指向包含字符串的字符数组的指针 . 相反,你传递的是一个角色 . 然后将该字符的值解释为地址并取消引用 . 这会调用未定义的行为 .

  • 0

    在C中,字符串文字以这种方式表示: "n" ,但是你有字面文字, 'n' ......它们非常不同 . 对参数使用字符串文字,它应该更好 .

相关问题