从 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 和所有评论并为我的原始问题提供可能解决方案的人。
我目前正在尝试编写一个程序,该程序将逐行读取文件并将内容放入数组中。然后尝试将原始数组反转为第二个数组,以便稍后比较这两个数组。我当前的代码是
#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 和所有评论并为我的原始问题提供可能解决方案的人。