在c中切换/字符串

时间:2015-10-22 21:48:37

标签: c string switch-statement

我试图让这个函数返回一个字符串。

char * vergleich(int random) {
    char *erg;
    switch(random) {
        case 1: erg = "Siccor" ; break;
        case 2: erg = "Paper" ; break;
        case 3: erg = "Rock"  ; break;
        case 4: erg = "Lizard" ; break;
        case 5: erg = "Spock" ; break;
        default: break;
            return erg;
    }
}

int main() {
    srand(time(NULL));

    int p1 = rand() % 4;
    int p2 = rand() % 4;

    printf("player1 shows %s\n", vergleich(p1));
    printf("\n\tif Player 2 plays %s or %s Player1 wins\n", vergleich(p1+1), vergleich(p1+3));
    if(p2 == p1 + 1 || p2 == p1 +3) {
        printf("player1 wins");
    }else {printf("player2 wins");}
        return 0;
    }
}

我认为函数的初始化是错误的,但我真的不知道如何处理字符串,请帮忙。

如果我运行该程序,它只会在case > 2时崩溃。并且字符串没有正确显示。

2 个答案:

答案 0 :(得分:1)

您也可以直接返回字符串文字:

const char * vergleich(int random) {

    switch(random) {
        case 1: return "Siccor";  
        case 2: return "Paper";  
        case 3: return "Rock";  
        case 4: return "Lizard";  
        case 5: return "Spock";  
        default: break;

    }
   return "";
}

确实rand() % 4将返回0,1,2,3 - 你应该考虑它并适应你的需要。

同样在你的default案例中你会返回一个未初始化的指针,它会触发未定义的行为,这在我的解决方案中可以避免,如你所见。

答案 1 :(得分:1)

崩溃发生,因为函数vergleich()可以使用参数0p10时)和6 p1时调用是3。在交换机中不处理零和六,因此指针erg指向垃圾。

因此,我建议您枚举从04的商品。为了避免在添加过程中出现溢出,您还应该使用模运算%,例如(p1 + 3) % 5(p1 + 1) % 5

要从0生成随机4,您可以使用rand() % 5;