2016-07-07 53 views
0

所以我有以下代碼:獲得賽格故障用C

#include <stdio.h> 
#include <ctype.h> 

int main(void) { 

    char ch; 

    printf("Enter Phone Number: "); 
    ch = getchar(); 

    while (ch != '\n') { 
    switch(ch) { 
     case 'A': 
     case 'B': 
     case 'C': 
     printf('2'); 
     break; 
     case 'D': 
     case 'E': 
     case 'F': 
     printf('3'); 
     break; 
     case 'G': 
     case 'H': 
     case 'I': 
     printf('4'); 
     break; 
     case 'J': 
     case 'K': 
     case 'L': 
     printf('5'); 
     break; 
     case 'M': 
     case 'N': 
     case 'O': 
     printf('6'); 
     break; 
     case 'P': 
     case 'R': 
     case 'S': 
     printf('7'); 
     break; 
     case 'T': 
     case 'U': 
     case 'V': 
     printf('8'); 
     break; 
     case 'W': 
     case 'X': 
     case 'Y': 
     printf('9'); 
     break; 
     default: 
     printf('%c', ch); 
     break; 
    } 

    ch = getchar(); 
    } 
} 

,目標是:

input: CALLATT 
output: 2255288 

input: 1-800-COL-LECT 
output: 1-800-265-5328 

當我運行程序:

Enter Phone Number: CALLATT 
Segmentation fault: 11 

我做錯了什麼?

+1

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – Olaf

+2

「我做錯了什麼?」 - >您沒有完全啓用編譯器警告。正確啓用'printf('2');'會產生一個診斷,你會立即糾正它。節省您的時間。 – chux

+0

使用'gcc -g -Wall'進行編譯,然後使用'gdb'調試器 –

回答

1

您正在使用單引號分隔傳遞給printf的字符串。你需要使用雙引號。與其他調用

printf("%c", (char)ch); 

而且同樣printf

所以更改此設置:

printf('%c', ch); 

了這一點。

此外,還需要以檢測EOF條件申報chint

while ((ch != EOF) && (ch != '\n') { 
+0

也許這只是真正混淆的代碼。 JK! – nicomp

+2

...併購買一個真正的編譯器。他們是免費的,所以你應該能夠負擔得起。 :) – unwind

+0

@unwind我非常懷疑他沒有使用gcc,因爲他是Linux新手和編程。而gcc被認爲是一個真正的編譯器 –

-1

四件事情:

  1. 使用putchar,而不是printf
  2. 聲明chint
  3. while -loop中,輸入條件ch = getchar() != EOF
  4. while -loop的末尾刪除ch = getchar();
+0

請閱讀[回答](http://stackoverflow.com/help/how-to-answer)以及文本和代碼[formatting](http://meta.stackoverflow.com/questions/251361/how-do- I-格式我的代碼塊)。這將有助於提高答案的質量和可讀性。謝謝.. – user3078414