【问题标题】:Only certain palindromes get written to file只有某些回文被写入文件
【发布时间】:2020-04-29 19:38:46
【问题描述】:

我正在做一个项目,该项目需要我从名为“input.txt”的文件中读取输入,然后

  1. 检查一个单词是否为回文,如果是则将其写入 palindrome.txt
  2. 使用凯撒密码,将其移动 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


【解决方案1】:

您的 isPalindrome() 函数已损坏 - 它不会终止字符串 t。我在main() 中调用isPalindrome() 之前添加了一个简单的printf() 语句:

printf("word [%s] %d\n", str, isPalindrome(str));

运行损坏的版本时,我得到:

word [madam] 1
word [quesadilla] 0
word [starman] 0
word [wow] 0
word [cheese] 0
word [racecar] 0
word [beeb] 0

isPalindrome()中的循环之后,添加:

t[n] = '\0';

那么输出是:

word [madam] 1
word [quesadilla] 0
word [starman] 0
word [wow] 1
word [cheese] 0
word [racecar] 1
word [beeb] 1

我也遇到了崩溃,因为您的代码没有检查文件是否已成功打开。始终检查文件是否已成功打开。

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多