我正在尝试编写一个可以为用户输入调用的函数,因此我可以随时调用它,并且可以将其分配给变量。 但是,由于某种原因,它似乎将输入限制在 8 个字符,无论它是高于还是低于 8 个字符。
char * userInput(){
char * user_input;
user_input = malloc(sizeof(char)*100);
printf("Type > ");
scanf("%s",user_input);
printf("%ld",sizeof(user_input));
return user_input;
}
输出
键入>是句子
8你好,你是
有问题的陈述是这样的
printf("%ld",sizeof(user_input)); /* It desn't return the number of char stored in user_input */
由于user_input
是一个字符指针,而S izeof 指针在32
位机器上始终是4
个字节,在 64 位机器上是8
个字节。
我的建议是使用fgets()
而不是scanf()
.例如
声明字符指针并分配内存。
char * user_input = NULL;
user_input = malloc(sizeof(*user_input) * MAX_BUF_SIZE); /* Instead of magic number use macro */
对malloc()
进行正确的错误处理。例如
if(user_input == NULL) {
fprintf(stderr, "memory allocation failedn");
exit(-1);
}
使用fgets()
而不是scanf()
扫描输入。
size_t retStrCspn = 0;
if(fgets(user_input, MAX_BUF_SIZE, stdin) != NULL) {
/* fgets success. next task is remove the trailing n char read by fgets() */
user_input[retStrCspn = strcspn(user_input, "n")] = 0; /* remove the trailing & use the return value */
}
现在打印长度,不要用sizeof
,用strcspn()
的返回值为例
printf("%zu", retStrCspn);
而不是:
printf("%ld",sizeof(user_input));
写:
printf("%ld",strlen(user_input));
请注意,如果在输入中写入超过 99 个字符,程序将表现不佳。