有一个测试卡在无限循环你能找到吗?

时间:2018-05-10 08:37:43

标签: c testing infinite-loop

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和一个循环,它将它与另外一个输入进行比较,你可以循环每个字母多少次(不需要检查输入是,但循环数int

1 个答案:

答案 0 :(得分:0)

你的程序有很多问题:

  • 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;
}