(null) 在打印字符串时正在打印
(null) is being printed while printing a string
我写了一个 C 程序,它接受用户输入的字符串并将其打印在屏幕上。
int main (void)
{
char* string;
scanf("%s", string);
printf("%s", string);
return 0;
}
但输出结果不理想。
我输入了 foo
。程序打印出来(null)
。谁能解释为什么?
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;
}
您没有为 string
分配内存。因此,通过写入未启动的指针,您可以调用 undefined behavior.
在使用string
之前,要么必须使用malloc()
或family动态分配内存,要么将string
定义为数组,如char srting[32]
之类的.
此外,FWIW,最好通过分配的内存限制输入大小,例如
scanf("%31s", string);
在输入比预期长的情况下防止缓冲区溢出。
scanf
没有为 string
分配任何内存;您需要在调用该函数之前自己执行此操作。否则你的程序行为是 undefined.
一个简单的方法是重构为 char string[100];
说,希望 scanf
不会尝试读取超过 99 个字符加上空终止符。
稍后,您会发现希望太高,最终会编写自己的 I/O 函数。
我写了一个 C 程序,它接受用户输入的字符串并将其打印在屏幕上。
int main (void)
{
char* string;
scanf("%s", string);
printf("%s", string);
return 0;
}
但输出结果不理想。
我输入了 foo
。程序打印出来(null)
。谁能解释为什么?
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;
}
您没有为 string
分配内存。因此,通过写入未启动的指针,您可以调用 undefined behavior.
在使用string
之前,要么必须使用malloc()
或family动态分配内存,要么将string
定义为数组,如char srting[32]
之类的.
此外,FWIW,最好通过分配的内存限制输入大小,例如
scanf("%31s", string);
在输入比预期长的情况下防止缓冲区溢出。
scanf
没有为 string
分配任何内存;您需要在调用该函数之前自己执行此操作。否则你的程序行为是 undefined.
一个简单的方法是重构为 char string[100];
说,希望 scanf
不会尝试读取超过 99 个字符加上空终止符。
稍后,您会发现希望太高,最终会编写自己的 I/O 函数。