读取字符串到char *时出现分段错误

时间:2017-03-11 00:49:06

标签: c segmentation-fault scanf

我试图写出我认为简单的程序,但我遇到了一些问题。当我尝试将字符串读入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的新手。)

2 个答案:

答案 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指针。