2016-11-19 32 views
1

我正在寫一個程序,它可以讀取字母,並給它們賦值2^n,所以a=2^0b=2^1 .... z=2^25然後我總結它們。在輸入的某個地方必須是|,我之前的字母和後面的字母分開 - sum[0]=之前|,sum[1]=之後|。當我鍵入aeoifha|shzs,一切都OK了,但是當我鍵入|abcabc|,它給了我分割的錯,但我需要它告訴我它是|abcsum[0]=7sum[1]=0abc|sum[0]=0sum[1]=7。如果只有|,它是錯誤的。輸出是錯誤的,但它也給我分段錯誤。在使用getchar時在C中的分段錯誤()

下面是代碼:

const int table[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432}; 
const char *a_z = "abcdefghijklmnopqrstuvwxyz"; 
long long int sum[2] = {0}; 
int ch, count = 0; 

for(;;) 
{ 
    if(!islower(ch = getchar())) 
    { 
     if(ch == '\n' && sum[0] && sum[1]) 
      break; 
     else if(ch == EOF) 
      { 
      printf("Wrong.\n"); 
      } 
     else if(ch == '|' && sum[0] != 0 && count == 0) 
      { 
      count = 1; 
      continue; 
      } 
    printf("Wrong.\n"); 
    sum[0] = sum[1] = count = 0; 
    while(ch != '\n' && (ch=getchar())!=EOF && ch != '\n') 
    continue; 
    } 
sum[count] += table[strchr(a_z, ch) - a_z]; 
} 

任何想法如何擺脫故障,以及如何給予和[] = 0?

+0

擺脫故障的方法是先找到原因。找到原因的方法是使用調試器。 – kaylum

+0

如果您需要幫助,請使用正確的縮進來格式化您的代碼,並告訴我們*精確*測試輸入。 – kaylum

+0

我懷疑這條線沒有做你期望的: sum [count] + = table [strchr(a_z,ch) - a_z]; –

回答

0

在更新sum[count]之前,您沒有檢查strchr(a_z, ch)是否不爲NULL,這意味着ch不是預期的'a'...'z'字符。

進入"abc|"並按下「返回」鍵之後,將額外'\n' = 0x0A被解析而不是由if(ch == '\n' && sum[0] && sum[1]) break;因爲sum[1]等於0過濾。

首先修改:(左或右丟失時甚至停止)

但是,爲了防止丟失'|',休息條件應是真實的,只有 時count = 1(等於'|'檢測)。

if(!islower(ch = getchar())) 
    { 
     if(ch == '\n' && (sum[0] || sum[1]) && (count == 1)) 

代替

if(!islower(ch = getchar())) 
    { 
     if(ch == '\n' && sum[0] && sum[1]) 

第二變形(力切換到計數= 1甚至留下缺失):

 else if(ch == '|' && count == 0) 
     { 
      count = 1; 

代替

 else if(ch == '|' && sum[0] != 0 && count == 0) 
     { 
      count = 1; 

並防止意外ch值,過濾器前:

if (strchr(a_z, ch)!=NULL) { // only 'a' to 'z' characters 
     sum[count] += table[strchr(a_z, ch) - a_z]; 
    } 
+0

謝謝!但是現在當我輸入沒有|的字母時,它會說「錯」,但它會計數字母。那麼如何添加一個條件,即使sum [0] = 0,仍然必須是'|' int開頭(結尾相同 - 例如ssdfkljsdfois |)? – anonym

+0

在中斷條件中添加'&&(count == 1)'以確保已檢測到''''。 –