2015-11-30 124 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++; 
}