C 中的文件处理 在输入的输出中打印出反向字符串

File Handling in C Print out the reverse String in the output from the input

好的,所以我在 C 中的文件处理和字符串方面遇到了很多问题。此任务的重点是从输出中反转字符串并将小写字母转换为大写字母,反之亦然。例如,我必须从飞机上获得 ENALPOREa 的输出。我必须有 2 个文件。我在其中编写了 Airplane 的输入文件和在其中获得 ENALPOREa 的输出文件。感谢您的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void inputOfAString(const char*nameOfTheFile){
FILE *fin = fopen(nameOfTheFile,"w");

if(fin == NULL){
   printf("Error");
   exit(1);
}

char s[20];
fgets(s,20,stdin);
fprintf(fin,"%s",s);

fclose(fin);
}


void readTheString(const char *inputOfTheFile,const char*outputOfTheFile){
   FILE *fout = fopen(outputOfTheFile,"w");
   FILE *fin = fopen(inputOfTheFile,"r");
   if(fout == NULL || fin == NULL){
       printf("Error");
       exit(1);
   }
   char s[20];
   while(!feof(fin)){
       fgets(s,20,inputOfTheFile);
       for(int i = 0;i<20;i++){
           if(s[i] == isupper(s[i])){
               s[i] = tolower(s[i]);
           }else{
               s[i] = tolower(s[i]);
           }
       }
       fputs(s,fout);
   }

   fclose(fout);
   fclose(fin);
}

int main(){
   inputOfAnString("input1.txt");
   readTheString("input1.txt","output1.txt");
   return 0;
}


测试fgets()的结果,而不是feof()
(无论文本或讲师建议什么 feof() - 怀疑对待)。

使用isupper()的结果作为T/F测试。

一个分支应该使用toupper()

迭代到字符串末尾,可能小于20

   char s[20];
   //while(!feof(fin)){
   //    fgets(s,20,inputOfTheFile);
   while(fgets(s, sizeof s, inputOfTheFile)) {
       // for(int i = 0; i < 20;i++){
       for(int i = 0; s[i];i++){
           // if(s[i] == isupper(s[i])){
           if(isupper(s[i])){
               s[i] = tolower(s[i]);
           }else{
               //s[i] = tolower(s[i]);
               s[i] = toupper(s[i]);
           }
       }
       fputs(s,fout);
   }

高级:使用 unsigned char 避免调用带有负值的 is...(), to...()

紧的选择

   #define S_SIZE 20
   char s[S_SIZE];
   while (fgets(s, sizeof s, inputOfTheFile)) {
       const unsigned char *p = (const unsigned char *) s;
       while (*p) {
           if(isupper(*p)) {
               *p = tolower(*p);
           } else {
               *p = toupper(*p);
           }
           p++;
       }
       fputs(s, fout);
   }