我写了一个C程序,它从用户那里获取一个字符串输入并将其打印在屏幕上。
int main (void)
{
char* string;
scanf("%s", string);
printf("%s", string);
return 0;
}
但输出是不可取的。
我提供了输入foo
。节目打印出(null)
。谁能解释为什么?
答案 0 :(得分:5)
char* string;
这只是指向char
的指针。它还没有指向任何记忆。您需要为要保留的字符分配内存。
您可以使用malloc()
#include<stdio.h>
#include<stdlib.h>
int main(void){
char *string;
string = malloc(100); //string of length 100
if(string == NULL){
printf("Error\n"); //if malloc() fails
}
if((scanf("%99s", string)) != 1){ //if scanf() fails
printf("Error, Fix it!\n");
exit(1);
}
printf("%s\n",string);
free(string);
return 0;
}
或者,使用数组
#include<stdio.h>
#include<stdlib.h>
int main(void){
char string[100];
if((scanf("%99s", string)) != 1){
printf("Error, Fix it!\n");
exit(1);
}
printf("%s\n",string);
return 0;
}
答案 1 :(得分:3)
您没有为string
分配内存。因此,通过写入未启动的指针,您可以调用undefined behavior。
在使用string
之前,您必须使用malloc()
或系列动态分配内存,或将string
定义为数组,例如char srting[32]
或其他内容。< / p>
另外,对于FWIW,最好用分配的内存来限制输入大小,比如
scanf("%31s", string);
在输入时间长于预期的情况下防止缓冲区溢出。
答案 2 :(得分:3)
scanf
没有为string
分配任何内存;你需要在调用函数之前自己做这件事。此外,您的程序行为未定义。
一种简单的方法是重构为char string[100];
,并且希望 scanf
不会尝试读取超过99个字符加上空终止符。
稍后,你会意识到希望太多了,并且最终会编写你自己的I / O函数。