I'm getting crazy with C. I'm programming with JavaScript, Ruby, Python, PHP, Lua, even Java... Recently, I tried to program a simple Read-Eval-Print-Loop in C. And I have a very strange behavior with this simple, basic, code, on Windows 10. This code is compiled with the standard toolchain of Visual Studio.
Help me, you are my only hope.
#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);
char 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] = c;
count += 1;
}
printf("Count : %d\n", count);
printf("%s\n", line);
printf("End of program.\n");
fflush(stdout);
free(line);
return EXIT_SUCCESS;
}
Expected output:
Enter: hello
Count : 5
hello
Actual output (1):
Enter: hello
Actual output (2):
There are several issues with your code:
#include <string.h>
for memset
fflush(stdin)
has undefined behaviour (OK, you've commented it out, but it's still good to know)getchar()
returns an int
, not a char
. Read this for more explanations.memset(&line, '\0', line_length)
is wrong it should be memset(line, '\0', line_length);
(without the &
), line
is already the pointer to the memory you want to set to 0.Corrected code, see my comments starting with ///
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /// added
int main(int argc, char* argv[])
{
const size_t line_length = 1024;
char* line = malloc(line_length);
memset(line, '\0', line_length); /// removed &
int c; /// int instead of char
unsigned short count = 0;
// fflush(stdin); /// 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;
}