【问题标题】:change letters in strings更改字符串中的字母
【发布时间】:2020-04-16 21:26:29
【问题描述】:

我正在做一个将字母“e”更改为“a”的项目,但我仍然没有完全正确。我的输入是一个文件 abc.txt: '''

Im enne end
my ded is frenk
My mom is elycie Lou

''' 我的输出是“我的妈妈是 alycie Lou”,在另一行中是“我的妈妈是 alicya Lou”。 这是我的代码。谁能帮帮我?

'''

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 3
#define MAX_STRING_SIZE 50


int main()
{
   char line[MAX_LINE][MAX_STRING_SIZE];
   int i=0;
   FILE *arch;
   arch = fopen("abc.txt", "r");

   if (arch==NULL){
       printf("ERROR");
    }
    else{
        while (!feof(arch)){
            fgets(line[i], MAX_STRING_SIZE , arch);
            i++;
        }
    }
    fclose(arch);

    for ( i=0; line[i][MAX_STRING_SIZE]; ++i )
    {
        if ( line[i][MAX_STRING_SIZE] == 'e' )
        {
            line[i][MAX_STRING_SIZE] = 'a';

        }
    }printf("%s", line);

    return 0;
}

'''

【问题讨论】:

  • 您正在将所有行读取到同一个缓冲区中,最终只得到最后一行(每次读取新行时都会覆盖前一行)。尝试在 while 循环中处理每一行,在阅读后立即处理,而不是在末尾。
  • 另外,for 循环没有意义......您正在迭代字符串中的字符以进行替换,但每次替换字符时打印字符串而不是在所有替换完成后只需一次。

标签: c string main


【解决方案1】:

当你想对整个文件的内容做一些事情时(将所有'e's 更改为'a's,删除所有出现的单词"very",...)你应该想到的第一件事about 是:我将逐行读取文件,处理每一行直到没有更多行。该想法最直接的实现是

char line[MAX_LINE_LENGTH];
// use FILE *f = fopen(filename, "r"); instead of stdin
while (fgets(line, sizeof line, stdin)) {
    process(line);
}
// remember to fclose(f) if not using stdin

记住这 4(或 6)行;你会经常使用它们。

在您的特定情况下(您想用'a's 而不是'e's 打印行)process() 函数可能类似于:

void process(const char *line) {
    for (int i = 0; i < strlen(line); i++) {
        if (line[i] == 'e') putchar('a');
        else putchar(line[i]);
    }
}

就是这样。您的大部分程序已完成。

添加正确的#includes、错误检查、main() 并收工。

【讨论】:

    【解决方案2】:

    这里有一些我会考虑实施的技巧

    首先更改您的行声明,并声明一个不是i 的计数器。我们将同时使用icounter

    char line[MAX_STRING_SIZE];
    int counter = 0;
    

    然后我会对读取文件的 while 循环执行此操作。请注意,如果counter 等于或超过MAX_LINE,则循环将退出:

    
    while (((fgets(line, MAX_STRING_SIZE , arch)) != NULL) && counter < MAX_LINE)
    {
        for ( i=0; line[i]; ++i )
        {
            if ( line[i] == 'e' )
            {
                line[i] = 'a';
            }
        }
        printf("%s", line);
        counter++;
    }
    

    试试这些,看看它是否会产生所需的行为。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      int main()
      {
         int i;
         char line[50];
         FILE *arch;
         arch = fopen("abc.txt", "r");
      
         if (arch==NULL){
             printf("ERROR");
      

      更好:perror("abc.txt"); exit(EXIT_FAILURE);

          }
          else{
              while (!feof(arch)){
      

      while(!feof()) is always wrong

                  fgets(line, 50 , arch);
                  //store all strings from the file
              }
      

      不!这不会存储文件中的所有字符串。这将从文件中读取所有字符串,将最后一个读取的字符串保留在line 中。在您的情况下,当循环完成时(忽略来自 while(!feof()) 的错误),line 将包含文件的最后一行。

          }
          fclose(arch);
      
          for ( i=0; line[i]; ++i )
          {
              if ( line[i] == 'e' )
              {
                  line[i] = 'a';
                  printf("%s", line);
      

      您想打印与'e's 一样多的行吗?如果您只想在所有 'e's 已转换后打印一次,请将 printf 行移动到 for 循环结束后

              }
          }
      
          return 0;
      }
      

      玩得开心!

      【讨论】:

      • 感谢您的触摸!但是,如果我执行以下操作: fgets(line[i], 50 , arch) 和 i++ 来存储所有字符串;它也错了,对吧?
      • 是的,这是错误的。您需要一个数组数组(一个字符串数组),如char line[MAX_LINES][MAX_LENGTH];,然后您可以在循环内读入line[i](并更新i++
      • 我更改了上面的代码,现在它只读取第一行。你能告诉我是什么问题吗? :)
      • @Mungo 您没有在阅读后立即处理该行。为了保留 PMG 的答案,我在下面附上了我自己的答案。切勿使用feof(),而是检查fgets() 是否返回NULL
      • 成功了!太感谢了!你们帮了我很多。我对这件事很陌生,我的教授告诉我不要使用我们在课堂上还没有看到的功能。这就是我使用“feof”的原因,因为他只教我阅读文件。但是你把它的方式允许我使用,我没有想到这一点。非常感谢你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2016-05-09
      • 2023-02-04
      • 2018-06-07
      相关资源
      最近更新 更多