从 C 文件中读取输入时反转数组的问题

Trouble with reversing an array while reading input from a file in C

我目前正在尝试编写一个程序,该程序将逐行读取文件并将内容放入数组中。然后尝试将原始数组反转为第二个数组,以便稍后比较这两个数组。我当前的代码是

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

     void reversing(char buffer[], char reverse[], int stringLength);

     int main(int argc, char const *argv[])
     {
        int stringLength = 0;
        FILE *fp;   //Declaring a FILE type pointer calling it fp
        char buffer[64]; //Declaring a char array the size of 64 named buffer

        fp = fopen("./test.txt", "r"); 
        if(fp == NULL)
        {
          printf("File did not open!\n");
        }
        else
        {
              while(fgets(buffer, 64, (FILE*)fp) != NULL)
              {
                 printf("\nNormal String: %s", buffer); //Print content in buffer(original array)
                 stringLength = strlen(buffer);        //Storing the length of the readed input

                 char reverse[stringLength];  //Creating array for reversed comparision(comparision not implemented yet)

                 printf("String length: %d\n", stringLength); //Print string length(for debugging)
                 reversing(buffer, reverse, stringLength);
                 printf("Reversed String: %s\n", reverse);//Print content in reverse(Reverse array)
             }

             printf("\n\nEND OF FILE Reached!\n");

             fclose(fp);
       }    
        return 0;
    }

    void reversing(char buffer[], char reverse[], int stringLength)
    {
       int i = 0;
       int j = stringLength - 1;

       while(i < j)
       {
       reverse[j] = buffer[i];
       i++;
       j--;
       }
    }

我的测试文件很简单

    A
    AB
    ABC
    ABCD
    ABCDE

它应该打印到屏幕上

   Normal String:   A
   Reversed String: A 
   Normal String:   AB 
   Reversed String: BA
   Normal String:   ABC 
   Reversed String: CBA
   Normal String:   ABCD 
   Reversed String: DCBA
   Normal String:   ABCDE 
   Reversed String: EDCBA

当我通过调试器 运行 程序时,它显示一旦进入反转函数,字母就会被正确交换;但是,一旦它退出该函数并调用打印反向数组,它就会打印垃圾,但在垃圾内部是前两个元素正确交换。任何建议的帮助将不胜感激。

As a side note 我正在努力使它尽可能简单,因为真正的 objective 或者这个程序将采用它并在 ci20 机器上的汇编中实现它。

stringLength = strlen(buffer); //Storing the length of the readed input

char reverse[stringLength];   //Creating array for reversed comparision(comparision not implemented yet)

您没有足够的 space 来存储结尾的 [=14=]

char reverse[stringLength]; 

应该是

char reverse[stringLength + 1]; 

并且不要忘记在反向函数的最后添加这个 traling [=14=]

reverse[stringLength] = '[=13=]';

但请注意(在这种情况下)您不需要临时反转字符串,只需传递原始字符串并交换直到到达 NUL 字符,看看 How do you reverse a string in place in C or C++?

如果您正在寻找一个非常简单的解决方案,您可以使用 string.h 库中的 strrev。它为您反转字符串,这意味着您不必制作自己的字符串反转函数。你可以直接调用它。

像这样:

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

#define BUFFSIZE 64

int
main(void) {
    FILE *filename;
    char buffer[BUFFSIZE];
    int length;

    filename = fopen("test.txt", "r");

    if (filename == NULL) {
        fprintf(stderr, "%s\n", "Error Reading File!");
        exit(EXIT_FAILURE);
    }

    while (fgets(buffer, BUFFSIZE, filename) != NULL) {
        length = strlen(buffer)-1;

        if (buffer[length] == '\n') {
            buffer[length] = '[=10=]';
        }

        printf("Normal String: %s\n", buffer);
        printf("Reversed String: %s\n", strrev(buffer));
    }
    return 0;
}

您的问题出在反转函数中的 while (i < j) 行。 i 最终会小于 j 当只有一半的数组被反转时。相反,它应该是 while (i < stringLength)

您还应该将字符数组 char reverse[stringLength] 更改为 char reverse[stringLength + 1],这样您就可以将 space 作为 '[=18=]' 终止字符,您应该将其添加到数组中反转功能结束。

它应该是这样的:

void reversing(char buffer[], char reverse[], int stringLength)
{
    int i = 0;
    int j = stringLength - 1;

    while(i < stringLength)
    {
        reverse[j] = buffer[i];
        i++;
        j--;
    }
    reverse[i] = '[=10=]';
}

另请注意,文件的读取函数也在读取换行符,反转函数将其放在反转字符串的开头,因此输出如下所示:

Normal String: A
String length: 2
Reversed String: 
A

Normal String: AB
String length: 3
Reversed String: 
BA

Normal String: ABC
String length: 4
Reversed String: 
CBA

Normal String: ABCD
String length: 5
Reversed String: 
DCBA

Normal String: ABCDE
String length: 6
Reversed String: 
EDCBA


END OF FILE Reached!

在将换行符发送到反转函数之前,我会留给您解决删除换行符的问题。如果你想不明白,就在这个答案下评论,我会编辑答案。

为了解决我的问题,颠倒数组并忘记了 '[=12=]',没有为 '[=12=]' 提供足够的 space,并处理 fgets 添加一个新队。这是我当前正确运行的代码。

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

    void reversing(char buffer[], char reverse[], int stringLength);

    int main(int argc, char const *argv[])
    {
      int stringLength = 0;
      FILE *fp;         //Declaring a FILE type pointer calling it fp
      char buffer[64];  //Declaring a char array the size of 64 named buffer
      fp = fopen("./test.txt", "r");

      if (fp == NULL)
      {
        printf("File did not open\n");
        return 0;
      }
      else
      {
        while(fgets(buffer, 64, (FILE*)fp) != NULL)
        {
          printf("\nNormal String:   %s", buffer); //Print content in buffer(original array)
          stringLength = strlen(buffer);           //Storing the length of read input

          char reverse[stringLength + 1];

          reversing(buffer, reverse, stringLength);
          printf("Reversed String: %s\n", reverse);//Print content in reverse(Reverse array)
        }

      printf("\nEND OF FILE Reached!\n");
     }
     fclose(fp);
     return 0;
   }

  void reversing(char buffer[], char reverse[], int stringLength)
  {
    int i = 0;
    int j = stringLength - 1;
    while(i < stringLength)
    {
      reverse[j] = buffer[i]; //Swap elements
      i++;
      j--;
    }
    reverse[i] = '[=10=]'; //Add null terminating 

    i = 0;
    if(reverse[0] == '\n') //If first element is '\n' swift elements
    {
       while(i < stringLength)
       {
        reverse[i] = reverse[i + 1];
        i++;
       }
    }
  }

它现在打印到屏幕上

    Normal String:   A
    Reversed String: A

    Normal String:   AB
    Reversed String: BA

    Normal String:   ABC
    Reversed String: CBA

    Normal String:   ABCD
    Reversed String: DCBA

    Normal String:   ABCDE
    Reversed String: EDCBA

    END OF FILE Reached!

感谢@PhantomWhiskers 和所有评论并为我的原始问题提供可能解决方案的人。