2014-04-24 80 views
0

我正在制作一个程序,它将congress.txt中的字符全部大写,然后“将它们转换为两个字符”,(A转到C)(Z转到B)。但是没有任何内容正在打印,我主要关心的是如果我的数组正在被存储并传递给不同的功能。为什么没有打印? C编程

这是在congress.txt

国会不得制定法律尊重建立宗教或禁止自由行的;或者删除言论自由或新闻自由;或和平集会的人民的权利,并请求政府纠正不满。

#include<stdio.h> 

int processFile(int *store); 
int cipher(int *store, int *code); 
int outputCode(int *code); 

int main(void){ 
    int store[300], code[300], i; 

    processFile(store); 
    cipher(store, code); 
    outputCode(code); 
    getchar(); 
    return 0; 
} 

void processFile(int *store){ 
    int i, a = 0; 
    FILE *f = fopen("congress.txt", "r"); 

    for (i = 0; a != EOF;){ 
     fscanf(f, "%c", &a);  //store character in a 
     if (a <= 'Z' && a >= 'A'){ //store uppercase letters 
      store[i] = a; 
      i++; 
     } 
     if (a <= 'z' && a >= 'a'){ //store lowercase letters as uppercase 
      store[i] = a - 32; 
      i++; 
     } 
    } 
    i++; 
    store[i] = '\0'; 
} 

void cipher(int *store, int *code){ 
    int i; 

    for (i = 0; store[i] != 0; ++i){ 
     if (store[i] <= 'X' && store[i] >= 'A'){ //tests to see if the letter is between A and X 
      code[i] = (char)(store[i] + 2);   //shifts letter by two characters 
     } 
     if (store[i] >= 'Y' && store[i] <= 'Z'){ 
      code[i] = (char)(store[i] - 24);  //shifts Y and Z to A or B respectively 
     } 
    } 
} 

void outputCode(int *code){ 
    int i, a, b; 
    for (a = 0; code[a] != 0; ++a){ 
     if (!(a % 50)){        //makes a newline every 50 characters 
      printf("\n"); 
     } 
     for (b = 0; code[a] != 0 && b <= 5; ++b){ //prints chunks of 5 characters then makes a space 
      printf("%c", code[a]); 
     } 
     printf(" "); 
    } 

} 
+1

你应该明确提出终止''\ 0''你在'processFile'字符串的结尾... – Floris

+1

你或许应该改变你的'回报; '返回0;'或者因为函数必须返回一个'int'。另外,你的其他函数也应该返回一个值。如果你不需要,将返回类型改为'void'。我建议编译您的代码,并启用所有警告以尽早检测这些微小的错误。 – Rufflewind

+0

弗洛里斯会编辑我即将做到这一点? – ShaneBird

回答

1

有几件事情你的代码错误 - 其中许多你的编译器会抱怨。

要开始 - 您没有声明int的函数的返回值。只要让他们void,或返回的东西。

第二 - 你声明int a;,但继续使用它像一个char。声明它如何使用它。

第三 - 文件结束测试是用feof(f)而不是a != EOF完成的。

四 - 当你输出你的代码,你需要增加a,否则,你得到相同的值的五倍:

​​

五 - 你的打印程序并不能保证它会停止 - 如果你有一个单一的'\0'后跟其他垃圾,你会打印更多的垃圾(除非它发生在5的倍数)。你需要用零填充你的密码。

所以 - 工作代码:

#include<stdio.h> 

int processFile(int *store); 
int cipher(int *store, int *code); 
int outputCode(int *code); 

int main(void){ 
    int store[300], code[300], i; 

    processFile(store); 
    cipher(store, code); 
    outputCode(code); 
    printf("\n=====\n\n"); 
    return 0; 
} 

int processFile(int *store){ 
    int i; 
    char a = 0; 
    FILE *f = fopen("congress.txt", "r"); 

    for (i = 0; !feof(f) && i<299;){ 
     fscanf(f, "%c", &a);  //store character in a 
     if (a <= 'Z' && a >= 'A'){ //store uppercase letters 
      store[i] = a; 
      i++; 
     } 
     if (a <= 'z' && a >= 'a'){ //store lowercase letters as uppercase 
      store[i] = a - 32; 
      i++; 
     } 
    } 
    store[i]='\0'; 
    return 0; 
} 

int cipher(int *store, int *code){ 
    int i; 

    for (i = 0; store[i] != 0; ++i){ 
     if (store[i] <= 'X' && store[i] >= 'A'){ //tests to see if the letter is between A and X 
      code[i] = (char)(store[i] + 2);   //shifts letter by two characters 
     } 
     if (store[i] >= 'Y' && store[i] <= 'Z'){ 
      code[i] = (char)(store[i] - 24);  //shifts Y and Z to A or B respectively 
     } 
    } 
    for(; i<300; i++) code[i]=0; // pad with zeros 
    return 0; 
} 

int outputCode(int *code){ 
    int i, a, b; 
    for (a = 0; code[a] != 0; ++a){ 
     if (!(a % 50)){        //makes a newline every 50 characters 
      printf("\n"); 
     } 

     for (b = 0; code[a] != 0 && b <= 5; ++b){ //prints chunks of 5 characters then makes a space 
      printf("%c", code[a++]); 
     } 
     printf(" "); 
    } 
return 0; 
} 
+0

你是弗洛里斯的男人! (或女人,我不知道);) – ShaneBird

+0

我也能够注意到另一个小错误,虽然它是一个重要的错误。在outputCode中,第一个for循环在完成时不应该增加,因为它会跳过a的值。 – ShaneBird

+1

@shanebird - 很高兴你能工作,并注意到了额外的错误。这就是编程的工作原理 - 你修正了一件事,另一件显示出来... – Floris