【发布时间】:2020-04-29 19:38:46
【问题描述】:
我正在做一个项目,该项目需要我从名为“input.txt”的文件中读取输入,然后
- 检查一个单词是否为回文,如果是则将其写入 palindrome.txt
- 使用凯撒密码,将其移动 13 位并将其写入 cipher.txt
虽然第二部分似乎工作正常,但我遇到了一些回文未写入文件的问题,即使回文函数确实将它们识别为回文(单独测试)。我的 input.txt 测试文件包含以下文字:
女士油炸玉米饼星人哇奶酪赛车
虽然 'madam' 和 'racecar' 正确写入 palindrome.txt,但 wow 没有.还尝试了另一个回文 'beeb',它也没有写入文件。如前所述,我相信 isPalindrome 函数运行良好,而 input.txt 的所有单词也正确更改为 cipher.txt (因此单词不会被完全跳过)。目前迷失了可能导致此问题的原因。以下是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int isPalindrome(char str[])
{
char t[100];
int n = strlen(str);
for(int i=0; i<n; i++)
{
t[i] = str[n-i-1];
}
if(!strcmp(str, t))
{
return 1;
}
else
{
return 0;
}
}
char* cypher(char str[])
{
char *encrypted = malloc( sizeof(char) * 100);
int n = strlen(str);
for(int i=0; i<n; i++)
{
if(str[i] >= 65 && str[i] <= 90)
{
encrypted[i] = (str[i]+13-65)%26+65;
}
else if(str[i] >= 97 && str[i] <= 122)
{
encrypted[i] = (str[i]+13-97)%26+97;
}
}
return encrypted;
}
int main (void)
{
FILE *fin, *fpal, *fcip;
char str[32];
int ret;
char *encrypted;
fin = fopen( "input.txt", "r");
fpal = fopen( "palindrome.txt", "w");
fcip = fopen("cipher.txt", "w");
ret = fscanf( fin, "%s", str );
while(ret==1)
{
if(isPalindrome(str))
{
fprintf(fpal, "%s\n", str );
}
encrypted = cypher(str);
fprintf(fcip, "%s\n", encrypted);
free(encrypted);
ret = fscanf(fin, "%s", str );
}
fclose(fin);
fclose(fpal);
fclose(fcip);
return 0;
}
【问题讨论】:
-
您使用的是哪个操作系统?您可能希望在
fopen调用的最后一个参数中使用“rt”和“wt”,以文本模式打开文件。 -
@1201ProgramAlarm 使用 PuTTY 连接 Linux 环境,自己运行 Windows。尝试使用“rt”和“wt”,但不幸的是没有改变结果。
-
请注意,
"r"表示“打开文本文件进行阅读”;使用"rb"打开一个二进制文件进行读取。在 POSIX 系统上,"r"和"rb"之间没有区别。使用"rt"将代码限制在 Windows 上——它在其他系统上无效。类似的 cmets 适用于"w"和"a"。 -
您是否尝试过使用调试器进行单步调试?
标签: c file-io palindrome caesar-cipher