用C语言从键盘读取字符串

用C语言从键盘读取字符串,c,string,pointers,exc-bad-access,C,String,Pointers,Exc Bad Access,我试图从键盘读取字符串并将其存储在字符指针中。但它似乎不起作用。谁能帮帮我吗。这是代码 char *city = "Bangalore"; char *state; state = city; printf("Enter your state : "); scanf("%s",state); // I get Bad access here. 但当我用这个的时候不会崩溃 char city[] = "Bangalore"; char *state = city; printf("Ente

我试图从键盘读取字符串并将其存储在字符指针中。但它似乎不起作用。谁能帮帮我吗。这是代码

char *city = "Bangalore";
char *state;
state = city;

printf("Enter your state : ");
scanf("%s",state);   // I get Bad access here.
但当我用这个的时候不会崩溃

char city[] = "Bangalore";
char *state = city;
printf("Enter your state : ");
scanf("%s",state);

您没有分配内存来存储状态名,因此当您尝试在str中写入时,会出现错误的访问错误。您应该按如下方式修复程序(假设最大名称长度为256)。但这将消耗堆栈中的256字节

int main() {
  char state[256];

  printf("Enter your state : ");
  scanf("%s",state);
  return 0;
} 

赋值(state=city;)运算符之所以有效,是因为您正在将一个指针值赋值给另一个指针,即仅将存储在city中的地址复制到state

为字符串分配内存有两种不同的方法:

  • char*str=“一些字符串”它位于不可写位置
  • charstr[]=“一些字符串”它位于堆栈上,因此是可写的
  • 因为您试图将指针传递到一个不可写的位置,然后将其写入,所以会出现错误。如果希望字符串是可变的,则需要在堆栈或堆上分配内存。任何人都可能会像kd84建议的那样在堆栈上进行分配:

    char state[256]; // take any size, that is reasonably high here
    

    您需要分配内存,以便以任何可预测的行为写入内存,但状态指向城市,对吗?因此,它有一个内存位置,而不是一个悬空指针。城市是一个常量字符串,您不能覆盖它。看见要修复此问题,只需在写入堆栈之前在堆栈或堆上分配状态即可