我对 C 很着迷。 我正在使用 JavaScript、Ruby、Python、PHP、Lua,甚至 Java 进行编程... 最近,我尝试用 C 语言编写一个简单的 Read-Eval-Print-Loop 程序。 在 Windows 10 上,我对这个简单、基本的代码有一种非常奇怪的行为。 该代码是使用 Visual Studio 的标准工具链编译的。
帮助我,你是我唯一的希望。
#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):
您的代码存在几个问题:
#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;
}