Только определенные палиндромы записываются в файл - PullRequest
0 голосов
/ 13 января 2020

Я работаю над проектом, который требует, чтобы я прочитал ввод из файла с именем 'input.txt' и

  1. проверил, является ли слово палиндромом, если это так, запишите его в palindrome.txt
  2. с использованием шифра Цезаря, сдвиньте его на 13 мест и запишите его в cipher.txt

Хотя вторая часть, кажется, работает нормально, у меня есть проблемы с некоторыми палиндромами, которые не пишутся в файл, даже если функция палиндрома распознает их как палиндромы (проверено отдельно). Мой тестовый файл input.txt содержит следующие слова:

Мадам Кесадилья Старман Вау, сыр гоночный автомобиль

Пока 'Мадам' и 'racecar' правильно записываются в palindrome.txt, вау нет. Также пробовал с другим палиндромом '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;
}

1 Ответ

0 голосов
/ 13 января 2020

Ваша isPalindrome() функция не работает - она ​​не завершает нулевую строку t. Я добавил простое выражение printf() перед вашим вызовом в isPalindrome() в main():

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

После l oop в 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

Я также получил сбои, потому что ваш код не проверяет, открыты ли файлы успешно. Всегда проверяйте, чтобы файлы были успешно открыты.

...