2015-11-30 121 views
-2
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#define N 30 
int main() 
{ char c, y, input[N]; 
int X, i=0, j; 
printf("Give displacement\n"); 
scanf("%d",&X); 
printf("Give chars\n"); 

while(((c=getchar()) !=EOF) && (i<N-1)){ 
    input[i]=c; 
    i++; 

} 
input[i]='\0'; 
j=0; 
for(j=0; j<=i-1; j++){ 
    if (isalpha(input[j])){ 
     if (isupper(input[j])) 
      y=(input[j]-'A'+X)%26+'A'; 
     else 
      y=(input[j]-'a'+X)%26+'A'; 
     putchar(y); 
    } 


} 
return 0; 
} 

嘿所有。好吧,這段代碼似乎並不像它應該那樣工作。它在桌子上跳過2個位置而不是一個。這使得程序無法使用,因爲我需要一個包含30個職位的表格。我認爲問題出現在while循環中,但我真的無法找到它。任何幫助都會有所改觀。 在此先感謝。雖然循環表C

+0

請更具體一些;根據我的猜測,這個程序運行正常,即當給定一堆字符和一個位移時,它會將相同的字符「向右移動」(凱撒的密碼)返回。 – szczurcio

+0

只是一種風格nit-pick:對於(j = 0; j = i-1; j ++)'更容易被讀爲'for(j = 0; j

+0

'char c' - >'int c'因爲這是函數'getchar()'返回類型,它必須區分(一般情況下) EOF'從'255'。因爲這是'putchar()'的參數類型,並且因爲''A''計算爲'int',所以變量'char y'也會比'int y'更好。 –

回答

1

在呼叫scanf之後,輸入緩衝區中還有一個換行符。該換行成爲getchar讀取的第一個字符。

要獲得新行移出緩衝區,添加一個單獨的呼叫getcharscanf調用後右:

scanf("%d",&X); 
getchar(); 

這會給你你就錯過了額外的字符。

此外,如在評論中提到,c應該被定義爲int代替char,因爲getchar返回int。否則,EOF的測試將始終是錯誤的。

0

,如果你想30個字符,你必須定義N種爲31

[0 - 29] + '\ 0'

在你的第一個while循環,我相信,第二次測試是錯誤的:

這樣使用:

while(((c=getchar()) !=EOF) && (i<=N-1)){ 
    input[i]=c; 
    i++; 
}