/* * Looking at problem 3.43 in the Computer Systems textbook. $ gcc -D_FORTIFY_SOURCE=2 -fno-stack-protector -m32 -O0 -o 3p43 3p43.c /tmp/ccPBLyQ7.o: In function `my_getline': 3p43.c:(.text+0x7d): warning: the `gets' function is dangerous and should not be used. $ ./3p43 Type something. 012345678901234567890123 You said '01234567Àüà67890123' Segmentation fault * */ #include #include #include #include void trim(char* text){ /* remove trailing newline from string */ int length = strlen(text); if (length == 0) return; if (text[length-1] == '\n') text[length-1] = '\0'; } char* my_gets(char* buffer){ /* Evil version of gets using fgets */ /* Use at your own risk. Will facilitate buffer overflow errors. */ char* status = fgets(buffer, INT_MAX, stdin); trim(buffer); return status; } char* my_getline(){ /* Get user input. Copy to memory in heap, and return heap ponter. */ char buffer[8]; char* status = gets(buffer); /* or my_gets(buffer) */ char* result = malloc(strlen(buffer)); strcpy(result, buffer); return result; } int main(){ char* text; printf(" Type something. \n"); text = my_getline(); printf(" You said '%s'\n", text); return 0; }