使用带有指向字符的指针的scanf函数
可能重复:
使用scanf进行分段错误
我写了以下代码。
int main(){ char arrays[12]; char *pointers; scanf("%s",arrays); scanf("%s",pointers); printf("%s",arrays); printf("%s",pointers); return 0; }
当我写scanf("%s",pointers);
时,为什么会出错scanf("%s",pointers);
char *pointers;
必须初始化。在将字符串pointers
某个地址之前,您无法将字符串扫描到pointers
。 计算机需要知道从键盘读取的值的存储位置。
int main(){ char arrays[12]; char *pointers= arrays; scanf("%s",pointers); printf("%s",pointers); return 0; }
因为您正在写入尚未初始化的内存中的地址。 通过未初始化的指针写入内存指针会调用未定义的行为。 分配足够的内存:
pointers = malloc(256); if(!pointers) perror("malloc"); else scanf("%255s", pointers);
或者将其声明为静态数组:
char pointers[256];
您还应该考虑使用fgets()而不是scanf()。
您可能想要阅读i您对fgets()感兴趣:
scanf()和fgets()之间的区别
-
char *pointers;
创建一个指针变量。 -
pointers
是pointers
的address
,默认情况下是不确定的。 -
*pointers
是*pointers
的地址中的数据,在分配地址之前,您无法执行此操作。
就这样做吧。
char arrays[12]; char *pointers; pointers = arrays; scanf("%s",pointers);
你能详细说明错误,我现在不在编译器周围。
但是要使scanf和printf工作,你必须将它放在程序的顶部:
#include #include
两者都是C的标准库.IO包含scanf,我很确定printf是相同的。 但是,除非您知道哪些库需要哪些function,否则每个程序都包含两个标准库。 尝试使用自定义头文件,因此您不需要为每个文件提供大量#includes。
不要忘记用于内存分配的malloc
语句。
但是我不确定你试图用你的代码做什么,请详细说明一下?
pointers
正在使用而没有初始化,如int x; printf("%d\n", x);
int x; printf("%d\n", x);
。 在使用之前,您需要使指针指向某个东西。 你正在读哪本书?
pointers
是一个整体指针。 你无法写入它。 您将分配足够的内存来存储字符串,就像使用arrays
。 使用指针,可以使用动态分配(参见malloc
)。