我试图写出我认为简单的程序,但我遇到了一些问题。当我尝试将字符串读入char指针时,我得到了一个分段错误,但只在代码的某些部分。我觉得这是我阅读字符串的方式的一个问题,但我不会获得比segfault更多的信息。
这是我的代码:
#include <stdio.h>
#include <string.h>
int main() {
char *Q_or_U;
char *E_or_P;
int entry;
int rc;
while(1) {
printf("Would you like to query or update? (q/u): ");
rc = scanf("%s", Q_or_U);
if (rc != 1) break;
printf("received %s\n", Q_or_U);
if (strcmp(Q_or_U, "q") == 0 || strcmp(Q_or_U, "Q") == 0) {
//execution fine in this block
printf("Which entry would you like to query? ");
rc = scanf("%d", &entry);
if (rc != 1) break;
printf("received %d\n", entry);
}
else if (strcmp(Q_or_U,"u") == 0 || strcmp(Q_or_U, "U") == 0) {
//misbehaving
printf("Would you like to encrypt that message? (y/n): ");
rc = scanf("%s", E_or_P); //segmentation fault
if (rc != 1) break;
printf("received %s", E_or_P);
}
}
}
在尝试将字符串读入变量E_or_P时,会出现段错误,我缺少什么? (我是C的新手。)
答案 0 :(得分:3)
您的变量都是指针,但它们指向Universe中的随机字节。只是运气,当你写到那个地方时会导致崩溃。
你需要让它们指向允许在那里写一些有效的内存。
一种方法是使用malloc(char *Q_or_U = malloc(30);
),另一种方法是用内存(char Q_or_U[30];
左右)声明它们。
答案 1 :(得分:1)
你声明的char指针只是未初始化的指针。它们指向随机存储器地址,并且您正在尝试写入这些地址。
您必须将它们声明为静态数组或动态分配内存。
char Q_or_U[SIZE];
或
char *Q_or_U;
Q_or_U=(char*)malloc(SIZE*sizeof(char));
但似乎你只想读一个字符,所以没有数组和指针就足够了:
char Q_or_U;
rc = scanf("%c", &Q_or_U);
请注意&#34;&amp;&#34;。有关它的更多信息,请阅读c指针。