есть тест, который застрял в бесконечности цикла, вы можете найти его? - PullRequest
0 голосов
/ 10 мая 2018
int main() {
    int s, b;
    int hist[26] = { 0 };
    int hist2[26] = { 0 };
    char char1, char2;
    printf("Hello Netta, enter the letters you would like us to repeat ending with $:\n");
    scanf("%c", &char2);
    while (char2 != '$') {
        if (char2 >= 'A' && char2 <= 'Z')
            char2 = char2 + 32;
        int char3 = char2 - 'a';
        hist2[char3]++;
        scanf("%c", &char2);
        if (char2 < 0)
            break;
    }
    printf("How many times would you like to loop?\n");
    if (!scanf("%d", &s))
        return 0;

    printf("Enter the string you would like to be checked ending with $:\n");
    scanf("%c", &char1);
    if (char1 >= 'A' && char1 <= 'Z')
        char1 = char1 + 32;
     while (char1 != '$' && char1 > 0) {
         int char3 = char1 - 'a';
         hist[char3]++;
         scanf("%c", &char1);
     }
     for (int i = 0; i < 26; i++) {
        if (hist[i] > s * hist2[i]) {
            printf("Not enough letters\n");
            b = 0;
            break;
        } else {
            b = 1;
        }
    }
    if (b)
         printf("Congratulations! you have enough letters to create your song and win the Eurovision!\n");

    return 0;
}

// так что, по сути, это домашнее задание в моем университете, они попросили нас сделать ввод программы - char и loop, и она сравнивает его с еще одним вводом, сколько раз вы можете зацикливать каждую букву (не нужно проверять, что ввод верно, но номер цикла int

1 Ответ

0 голосов
/ 10 мая 2018

В вашей программе много проблем:

  • scanf() возвращает количество успешных конверсий. Сравните возвращаемое значение с 1 в вашей программе вместо тестирования 0, что никогда не произойдет для "%c" в любом случае. Кроме того, char2 не будет изменено, если поток находится в конце файла.

  • Вы должны проверить char2 букву перед индексированием в массиве, в противном случае вы можете получить доступ за пределами массива и иметь неопределенное поведение.

  • представление важно: используйте правильные отступы и интервалы, чтобы программа была читабельной.

  • включает необходимые заголовки, такие как <stdio.h>

Вот улучшенная версия:

#include <stdio.h>

int main() {
    int hist[26] = { 0 };
    int hist2[26] = { 0 };
    int s;
    char c;

    printf("Hello Netta, enter the letters you would like us to repeat ending with $:\n");
    while ((scanf("%c", &c) == 1 && c != '$') {
        if (c >= 'A' && c <= 'Z')
            hist2[c - 'A']++;
        else if (c >= 'a' && c <= 'z')
            hist2[c - 'a']++;
    }

    printf("How many times would you like to loop?\n");
    if (scanf("%d", &s) != 1)
        return 1;

    printf("Enter the string you would like to be checked ending with $:\n");
    while (scanf("%c", &c) == 1 && c != '$') {
        if (c >= 'A' && c <= 'Z')
            hist[c - 'A']++;
        else if (c >= 'a' && c <= 'z')
            hist[c - 'a']++;
     }
     for (int i = 0; i < 26; i++) {
        if (hist[i] > s * hist2[i]) {
            printf("Not enough letters\n");
            break;
        }
    }
    if (i == 26)
         printf("Congratulations! you have enough letters to create your song and win the Eurovision!\n");

    return 0;
}
...