使用带有指向字符的指针的scanf函数

时间:2013-01-27 09:17:27

标签: c scanf

  

可能重复:
  segmentation fault using 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);

时会出错

6 个答案:

答案 0 :(得分:12)

char *pointers; 
必须初始化

。在将字符串指向某个地址之前,您无法将字符串扫描到pointers。计算机需要知道从键盘读取的值的存储位置。

int main(){
   char arrays[12];
   char *pointers= arrays;
   scanf("%s",pointers);
   printf("%s",pointers);
   return 0;
}

答案 1 :(得分:7)

因为您正在写入尚未初始化的内存中的地址。通过未初始化的指针写入内存指针会调用未定义的行为。分配足够的内存:

pointers = malloc(256);
if(!pointers)
  perror("malloc");
else
  scanf("%255s", pointers);

或者将其声明为静态数组:

char pointers[256];

您还应该考虑使用fgets()而不是scanf()。

您可能想要阅读i您对fgets()感兴趣:

Difference between scanf() and fgets()

答案 2 :(得分:4)

  • char *pointers;创建一个指针变量。
  • pointersaddress指向的pointers,不确定者是 默认值。
  • *pointerspointers指向的地址中的数据,在分配地址之前,您无法执行此操作。

就这样做。

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);

答案 3 :(得分:2)

正在使用

pointers而未初始化,例如int x; printf("%d\n", x);。在使用之前,您需要使指针指向某个东西。你正在读哪本书?

答案 4 :(得分:2)

你能否详细说明错误,我现在不在编译器周围。

但是要使scanf和printf工作,你必须将它放在程序的顶部:

#include <stdio.h>
#include <stdlib.h>

两者都是C的标准库.IO包含scanf,我相当确定printf是相同的。但是,除非您知道哪些库需要哪些函数,否则每个程序都包含两个标准库。尝试使用自定义头文件,因此您不需要为每个文件提供大量#includes。

不要忘记内存分配的malloc语句。

但是我不确定你尝试用你的代码做什么,请详细说明一下?

答案 5 :(得分:1)

pointers是一个单位指针。你无法写入它。您将分配足够的内存来存储字符串,就像使用arrays一样。使用指针,可以使用动态分配(参见malloc)。