C switch returns default inside if/else

C switch returns default inside if/else

我有以下问题:我有两个 switch 语句。它们在分开时工作得很好,但当我把它们都放入 if/else 时。 switch 总是 returns 默认值(错误)。很抱歉措辞困难,现在我已经复制了整个程序以便您检查,我已经尝试过您所说的,但似乎没有帮助。例如,当它询问号码时,我的输入是 2。然后它询问我要选择什么字符(+-/*),无论我写哪个,它都会给我默认值输出就像我输入了错误的字符。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

void tomb_beolvas(int *szamok);
void tomb_kiir(int *szamok);
void tomb_sorrend(int *szamok);
void sorrend_kiir(int *szamok);
void kalkulator(int *szamok);

int main() {
    int szamok[10];
    tomb_beolvas(szamok);
    tomb_kiir(szamok);
    tomb_sorrend(szamok);
    sorrend_kiir(szamok);
    kalkulator(szamok);
    return 0;
}

void tomb_beolvas(int *szamok) {
    int i;
    srand(time(0));
    for (i = 0; i < 10; i++) {
        szamok[i] = rand() % (10) + 1;
    }
    return;
}

void tomb_kiir(int *szamok) {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d\n", szamok[i]);
    }
    return;
}

void tomb_sorrend(int *szamok) {
    int i;
    int a, j;
    for (i = 0; i < 10; ++i) {
        for (j = i + 1; j < 10; j++) {
            if (szamok[i] > szamok[j]) {
                a =  szamok[i];
                szamok[i] = szamok[j];
                szamok[j] = a;
            }
        }
    }
    return;
}

void sorrend_kiir(int *szamok) {
    int i;
    for (i = 0; i < 10; i++) {
        printf("\n%d", szamok[i]);
    }
    return;
}

void kalkulator(int *szamok) {
    char jel;
    int a, b, donto;
    printf("\nKerem valassza ki milyen modon szeretne megadni az adatokat:\n"
           " 1.: egyben(peldaul 5. + 8.)\n"
           " 2.: kulon(peldaul + aztan 5. es 8.)\n");
    scanf("%d", &donto);
    if (donto == 1) {
        printf("\nKerem irja be hanyadik szamokat szeretne es koze hogy milyen kalkulaciot szeretne vegezni(pl.: 5 + 8):\n");
        while (scanf("%d %c %d", &a, &jel, &b)) {
            switch (jel) {
              case '+':
                printf("%d", szamok[a-1] + szamok[b-1]);
                break;

              case '-':
                printf("%d", szamok[a-1] - szamok[b-1]);
                break;

              case '*':
                printf("%d", szamok[a-1] * szamok[b-1]);
                break;

              case '/':
                printf("%d", szamok[a-1] / szamok[b-1]);
                break;
            }
        }
    } else
    if (donto == 2) {
        printf("Adj meg egy jelet (+, -, *, /): ");
        scanf("%c", &jel);

        printf("add meg hanyadik szamokkal akarsz szamolni: ");
        scanf("%d %d", &a, &b);

        switch (jel) {
          case '+':
            printf("%d + %d = %d", szamok[a], szamok[b], szamok[a] + szamok[b]);
            break;

          case '-':
            printf("%d - %d = %d", szamok[a], szamok[b], szamok[a] - szamok[b]);
            break;

          case '*':
            printf("%d * %d = %d", szamok[a], szamok[b], szamok[a] * szamok[b]);
            break;

          case '/':
            printf("%d / %d = %d", szamok[a], szamok[b], szamok[a] / szamok[b]);
            break;

          // operator doesn't match any case constant +, -, *, /
          default:
            printf("Error! operator is not correct");
        }
    }
    return;
}

您的 switch 语句没有任何问题,但是:

int szamok[]={};

你不能创建一个空数组,你应该用一个大小来声明它:

const int size = 10;
int szamok[10];

据我所知,您通过使用越界索引(这是任何正数,因为您得到一个空数组)访问 szamok 调用了未定义的行为。

恐怕您的问题是典型的 scanf() 问题:您应该使用

而不是 scanf("%c", &jel);
scanf(" %c", &jel);  // notice the initial space before the `%c`

这将跳过 scanf("%d", &donto); 之后未决的换行符。