我正在尝试使用非固定的char数组读取用户输入,但是当我在键盘上输入内容时,它只是软崩溃(没有崩溃窗口)。当我在联机C编译器上运行它时,它就是说分段错误(内核已转储)。
我的代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int validerNAS(char* userInput);
int main() {
int valid = 0;
char* userInput;
do {
printf("Enter 9 characters: ");
gets(userInput);
valid = validerNAS(userInput);
} while (!valid);
return 0;
}
int validerNAS(char* userInput) {
if ((strlen(userInput) != 9)) {
printf("Error! You must enter 9 characters\n\n");
return 0;
}
return 0;
}
答案 0 :(得分:3)
这里
char* userInput;
userInput
没有有效的内存,因此您可以像
gets(userInput); /* this causes seg.fault because till now userInput doesn't have any valid memory */
因此,要克服此问题,请使用字符数组,例如
char userInput[100] = {0};
或创建动态数组,然后将数据扫描到动态分配的内存中。
也不要使用gets()
,而应使用here中的fgets()
例如
char* userInput = malloc(SOME_SIZE); /* define SOME_SIZE, creating dynamic array equal to SOME_SIZE */
fgets(userInput ,SOME_SIZE, stdin) ; /* scan the data from user & store into dynamically created buffer */
旁注,来自fgets的手册页
如果读取了换行符,则会将其存储到缓冲区中。一种 终止空字节(aq \ 0aq)存储在 缓冲区。
因此,通过调用strcspn()
删除尾随换行符。例如
userInput[strcspn(userInput, "\n")] = 0;
使用动态数组userInput
后,请不要忘记调用free()
来释放动态分配的内存,以避免内存泄漏。对于例如
free(userInput);