【发布时间】:2016-07-30 11:13:11
【问题描述】:
char *str;
while(1)
{
printf("$$$$>");
scanf("%s",str);
}
在这段代码中,我只想打印一个命令提示符。当用户输入某些内容时,什么也没有发生,命令提示符会再次打印。但是 scanf() 运行一次,然后 $$$$> 循环打印。 当我尝试使用字符数组而不是 str 指针时,代码运行。 为什么?
【问题讨论】:
char *str;
while(1)
{
printf("$$$$>");
scanf("%s",str);
}
在这段代码中,我只想打印一个命令提示符。当用户输入某些内容时,什么也没有发生,命令提示符会再次打印。但是 scanf() 运行一次,然后 $$$$> 循环打印。 当我尝试使用字符数组而不是 str 指针时,代码运行。 为什么?
【问题讨论】:
字符 *str;
您使用了str,但未对其进行初始化。在另一个函数(如scanf)中使用未初始化的指针会导致程序崩溃。
你可以通过malloc(动态分配)str指针来解决这个问题,但是对于这种简单的用法,你可以使用数组来代替。
char str[100] = "";
while(1)
{
printf("$$$$>");
// scanf("%s",str); // not recommended
fgets( str, sizeof( str ), stdin ); // fgets is better
}
【讨论】:
str[100]=""; 确保在任何操作之前将字符串初始化为空(即所有字符都设置为 0)。在使用之前初始化变量是一种很好的做法。
str作为指针; sizeof( str ) 在您的机器中只有 8 个字符,因此您只能输入 7 个字符。当我将str 声明为数组时,sizeof( str ) 将起作用。如果你坚持使用指针,那么你必须自己提供 100 而不是使用sizeof
因为您没有分配 str 可以指向的内存缓冲区,所以在 str decleration 下方添加这一行:
str=malloc(sizeof(char)*1000);
【讨论】:
sizeof(char) 始终为 1,因此不会为代码增加价值。如果要匹配str的类型,只需使用str=malloc(sizeof * str * 1000);
str = malloc(sizeof *str * 1000); 比 str=malloc(sizeof(char)*1000); 更容易编码,更不容易出错,更容易审查和维护 - IMO 拥有 30 多年的 C 经验。
你必须在声明指针后给字符串分配内存。您可以使用 malloc 或 calloc 函数来实现。
char *str = (char*) malloc(sizeof(char) * 100);
或
char *str = (char*) calloc(100, sizeof(char));
【讨论】: