奇怪的 printf 在 getchar 和 getchar 跳过后不起作用

问题描述 投票:0回答:1

我对 C 很着迷。 我正在使用 JavaScript、Ruby、Python、PHP、Lua,甚至 Java 进行编程... 最近,我尝试用 C 语言编写一个简单的 Read-Eval-Print-Loop 程序。 在 Windows 10 上,我对这个简单、基本的代码有一种非常奇怪的行为。 该代码是使用 Visual Studio 的标准工具链编译的。

  1. 有时(无法预测),字符串的读取会被跳过。我猜想 stdin 中一定有一些垃圾,但我无法用 fflush 刷新它,对吗?
  2. 每次,getchar 上的循环之后的所有 printf 都不起作用。什么也没有显示。我放 并冲洗无济于事。

帮助我,你是我唯一的希望。

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

int main(int argc, char * argv[])
{
    const size_t line_length = 1024;
    char * line = malloc(line_length * sizeof(char));
    memset(&line, '\0', line_length);
    int c;
    unsigned short count = 0;
    // fflush(stdin); // tried this, same thing
    printf("Enter: ");
    while ((c = getchar()) != '\n' && c != EOF && count < line_length - 1) {
        line[count] = (char) c;
        count += 1;
    }
    printf("Count : %d\n", count);
    printf("%s\n", line);
    printf("End of program.\n");
    fflush(stdout);
    free(line);
    return EXIT_SUCCESS;
}

预期输出:

Enter: hello
Count : 5
hello

实际产量(1):

Enter: hello 

实际产量(2):

c printf getchar
1个回答
1
投票

您的代码存在几个问题:

  • 你忘记了
    #include <memory.h>
    memset
  • fflush(stdin)
    有未定义的行为(好吧,你已经将其注释掉了,但知道它仍然很好)
  • getchar()
    返回
    int
    ,而不是
    char
  • 最重要的是:
    memset(&line, '\0', line_length)
    是错误的,应该是
    memset(line, '\0', line_length);
    (没有
    &
    ),
    line
    已经是指向要设置为0的内存的指针。

更正代码,请参阅我以

///

开头的评论
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>       ///

int main(int argc, char* argv[])
{
  const size_t line_length = 1024;
  char* line = malloc(line_length);
  memset(line, '\0', line_length);      ///
  char c;
  unsigned short count = 0;
    // fflush(stdin); // tried this, same thing  /// fflush(stdin); is UB
  printf(">>> ");
  while ((c = getchar()) != '\n' && c != EOF && count < line_length - 1) {
    line[count] = c;
    count += 1;
  }
  printf("Count : %d\n", count);
  printf("%s\n", line);
  printf("End of program.\n");
  fflush(stdout);
  free(line);
  return EXIT_SUCCESS;
}
© www.soinside.com 2019 - 2024. All rights reserved.