在while循环中输入键

时间:2016-01-20 21:54:20

标签: c enter getchar

#include <stdlib.h>
#include <stdio.h>

int main () 
{
    char word[100];

    while (word != "hello") {

        system("clear");

        printf("\nSay hello to me : ");

        scanf(" %s", word);
    }

    printf("congrats, you made it !");

    return 0;
}

在这段代码中:如果我输入任何东西而不是你好,循环继续。但是,输入ENTER键不会再循环,只会添加一行。

我在某处读到使用getchar()可能会有所帮助,但我对C开发有点陌生,而且我在这里搜索了几个小时如何使其工作。

编辑0:

删除

while (word != "hello")
char word[100];
scanf(" %s", word);

#include <string.h>
while (strcmp(word, "hello") != 0)
char word[100] = {0}; 
fgets(word, 6, stdin);

编辑1:

我试图在我的代码中包含类似的内容

fgets(word, 6, NULL);

但它让我遇到了分段错误。

**编辑2:**

正确的工作输入是:

fgets(word, 6, stdin);

所以它有效,但在问题上添加了超过6个字符,如:

Say hello to me : hello from the inside

只会打印:

Say hello to me :
Say hello to me :

所以我只修改了这个函数:

fgets(word, 100, stdin);

但现在它不会给我任何工作投入

2 个答案:

答案 0 :(得分:3)

三件事:

您不需要scanf格式字符串中的空格。 %s格式说明符已忽略前导空格。因此,而不是" %s"使用"%s"

主要问题是word != "hello"。这不是字符串的比较方式。您实际在做的是将word的地址与字符串常量"hello"的地址进行比较。要进行字符串比较,请使用strcmp。如果它返回0,则字符串是相同的,因此您的while循环应该检查非零:

while (strcmp(word,"hello")) {

请务必#include <string.h>获取strcmp的声明。

最后,您需要初始化word,以便初始字符串比较不会通过读取未初始化的数据来调用未定义的行为:

char word[100] = {0};

答案 1 :(得分:0)

@dbush很好地回答了OP最初的担忧。

OP正在使用fgets(word, 100, stdin);并且 h e l l o 输入。然后,word[]会被"hello\n"填充,但这不会传递strcmp(word, "hello") != 0

解决方案:剥离最终'\n'

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 100

int main() {
  char word[BUFFER_SIZE] = { 0 };

  while (strcmp(word, "hello") != 0) {
    system("clear");
    printf("\nSay hello to me : ");
    // insure buffered output is flushed
    fflush(stdout);

    // Avoid magic numbers, use `sizeof  word`
    // Test if input was received
    if (fgets(word, sizeof word, stdin) == NULL) {
      fprintf(stderr, "\nInput closed\n");
      return 1;
    }

    // lop off potential trailing \n
    word[strcspn(word, "\n")] = '\0';
  }

  printf("congrats, you made it !\n");
  return 0;
}