2017-03-11 132 views
0

我試圖編寫我認爲是簡單的程序,但我遇到了一些問題。當我嘗試將字符串讀入字符指針時,出現了分段錯誤,但僅限於代碼的某些部分。我覺得這是我在字符串中閱讀的一個問題,但我沒有得到比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

可能的重複[爲什麼我不能在第一次跟蹤失敗時再次在同一個變量上使用scanf](http://stackoverflow.com/questions/26478931/why-cant-i-use-scanf-on-同一變量再次當第一次失敗) – Dan

+0

請參閱[爲什麼大家都說不要使用scanf?我應該用什麼來代替?](http://c-faq.com/stdio/scanfprobs.html) – Dan

+0

使用'fgets'和'stdin'句柄,因爲它允許您限制將放置在您的緩衝。或者如果在POSIX系統上,使用'getline'。 – Dan

回答

3

你的變量都是指針,但它們指向宇宙中的隨機字節。當你寫信給那個地方的時候,只有運氣會導致崩潰。

你需要讓它們指向一些有效的內存以允許在那裏寫入。

一種方法是使用malloc(char *Q_or_U = malloc(30);),另一種方法是用內存(char Q_or_U[30];左右)聲明它們。

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); 

注意 「&」。有關更多信息,請閱讀有關c指針。