C 多字符常量,分配数组值时出现分段错误

C 多字符常量,分配数组值时出现分段错误,c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,所以我创建了一个玩围棋的程序,我从洗牌开始,然后打印它。我的问题是: 在分配数组值的过程中,“shuffle”函数的某个地方出现了分段错误 GCC正在抱怨“deck”中的多字符字符常量。我不知道如何申报一副牌 在尝试打印数组值时,我不断得到“下标值既不是数组,也不是指针,也不是向量” 我知道我的代码中可能有很多明显的错误。请原谅我。我是初学者 下面是代码(最后一个主要功能): #包括 #包括 #包括 #包括 #包括 整数洗牌(整数组[52],整数版本) {//这是在洗牌完成后存储洗牌牌组 int

所以我创建了一个玩围棋的程序,我从洗牌开始,然后打印它。我的问题是:

  • 在分配数组值的过程中,“shuffle”函数的某个地方出现了分段错误

  • GCC正在抱怨“deck”中的多字符字符常量。我不知道如何申报一副牌

  • 在尝试打印数组值时,我不断得到“下标值既不是数组,也不是指针,也不是向量”

  • 我知道我的代码中可能有很多明显的错误。请原谅我。我是初学者

    下面是代码(最后一个主要功能):

    #包括
    #包括
    #包括
    #包括
    #包括
    整数洗牌(整数组[52],整数版本)
    {//这是在洗牌完成后存储洗牌牌组
    int newdeck[52]={0};
    printf(“在洗牌中\n”);
    //我计划为洗牌组创建其他组合,但只从一个开始
    交换机(版本)
    {//这会将newdeck中的值设置为deck中的值,显然会混淆顺序
    //这也是我的细分错误所在。
    案例1:newdeck[0]=deck[26];
    新甲板[1]=甲板[13];
    新甲板[2]=甲板[33];
    新甲板[3]=甲板[45];
    新甲板[4]=甲板[19];
    新甲板[5]=甲板[36];
    新甲板[6]=甲板[42];
    新甲板[7]=甲板[24];
    新甲板[8]=甲板[51];
    新甲板[9]=甲板[22];
    新甲板[10]=甲板[15];
    新甲板[11]=甲板[10];
    新甲板[12]=甲板[3];
    新甲板[13]=甲板[6];
    新甲板[14]=甲板[43];
    新甲板[15]=甲板[48];
    新甲板[16]=甲板[27];
    新甲板[17]=甲板[18];
    新甲板[18]=甲板[1];
    新甲板[19]=甲板[31];
    新甲板[20]=甲板[14];
    新甲板[21]=甲板[0];
    新甲板[22]=甲板[21];
    新甲板[23]=甲板[12];
    新甲板[24]=甲板[41];
    新甲板[25]=甲板[35];
    新甲板[26]=甲板[16];
    新甲板[27]=甲板[4];
    新甲板[28]=甲板[9];
    新甲板[29]=甲板[40];
    新甲板[30]=甲板[25];
    新甲板[31]=甲板[34];
    新甲板[32]=甲板[44];
    新甲板[33]=甲板[7];
    新甲板[34]=甲板[5];
    新甲板[35]=甲板[38];
    新甲板[36]=甲板[46];
    新甲板[37]=甲板[37];
    新甲板[38]=甲板[49];
    新甲板[39]=甲板[39];
    新甲板[40]=甲板[23];
    新甲板[41]=甲板[50];
    新甲板[42]=甲板[20];
    新甲板[43]=甲板[2];
    新甲板[44]=甲板[11];
    新甲板[45]=甲板[47];
    新甲板[46]=甲板[28];
    新甲板[47]=甲板[17];
    新甲板[48]=甲板[30];
    新甲板[49]=甲板[8];
    新甲板[50]=甲板[29];
    新甲板[51]=甲板[32];
    打破
    }
    printf(“离开洗牌\n”);
    //返回洗牌牌组
    返回新甲板;
    }
    内部主(空)
    {//宣布一副牌。
    int CACK={'2S','3S','4S','5S','6S','7S','8S','9S','TS','JS','QS','AS','2H','3H','4H','5H','6H','7H','TH','JH','QH','KH','AH 2C','3C','7C','9C','TC JC','QC','AC','2D 3D','4D','6D','7D','9D','TD','JD','QD','QD','KD AD';
    //柜台
    int i;
    //此处用于调试目的以及其他类似事件
    printf(“进入洗牌\n”);
    //洗牌
    牌组=洗牌(牌组,1);
    printf(“打印组”);
    对于(i=0;i<52;i++)
    {
    printf(“%d”,deck[i]);//打印deck中的值(现在已洗牌,并从“洗牌”函数中设置为等于newdeck。我还得到错误“下标值是niether数组、指针或向量。”
    }
    返回0;
    }
    
    问题代码试图分配:

    int CACK={'2S','3S','4S','5S','6S','7S','8S','9S','TS','JS','QS','AS','2H','3H','4H','5H','6H','7H','TH','JH','QH','KH','AH 2C','3C','7C','9C','TC JC','QC','AC','2D 3D','4D','6D','7D','9D','TD','JD','QD','QD','KD AD'

    此尝试的分配存在多个问题。
  • deck
    是一个整数。不能为一个整数分配多个值
  • 分配的值不是整数。(即:0,1,2,3,-1,-2…)
  • 单引号
    在C中用于定义字符常量。(即:“a”、“b”、“C”、“X”、“Y”、“Z”、“1”、“2”、“3”和……)。上述赋值中的字符值都是非法的,因为它们都是两个字符。

    也许这就是我们的初衷:

    char*deck[]= { “2S”、“3S”、“4S”、“5S”、“6S”、“7S”、“8S”、“9S”、“TS”、“JS”、“QS”、“KS”、“AS”, “2H”、“3H”、“4H”、“5H”、“6H”、“7H”、“8H”、“9H”、“TH”、“JH”、“QH”、“KH”、“AH”, “2C”、“3C”、“4C”、“5C”、“6C”、“7C”、“8C”、“9C”、“TC”、“JC”、“QC”、“KC”、“AC”, “2D”、“3D”、“4D”、“5D”、“6D”、“7D”、“8D”、“9D”、“TD”、“JD”、“QD”、“KD”、“AD” })

    上面将deck定义为字符指针数组。字符指针可以指向字符数组(或字符串)的第一个字符。字符指针数组初始化为指向每个3个字符的字符串(两个可见字符,加上一个字符串终止字符
    '\0'


    上述问题(对C类型、指针等的有限理解)贯穿于问题代码中


    查看问题代码的“更正确”版本的扰流器。

    在您的机器上,
    int
    有多大。
    'xx'
    结构有多大?东西是以小端还是大端存储的?您是
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <time.h>
    
    int shuffle(int deck[52], int version)
    {   //this is to store the shuffled deck after it is finished
        int newdeck[52] = {0};
    
        printf("In shuffle\n");
        //I plan to create other combinations for a shuffled deck, but starting with only one
        switch (version)
        {       //this sets a value in newdeck to a value in deck, obviously mixing the order
                //this is also where I get my segmentation fault.
        case 1: newdeck[0] = deck[26];
                newdeck[1] = deck[13];
                newdeck[2] = deck[33];
                newdeck[3] = deck[45];
                newdeck[4] = deck[19];
                newdeck[5] = deck[36];
                newdeck[6] = deck[42];
                newdeck[7] = deck[24];
                newdeck[8] = deck[51];
                newdeck[9] = deck[22];
                newdeck[10] = deck[15];
                newdeck[11] = deck[10];
                newdeck[12] = deck[3];
                newdeck[13] = deck[6];
                newdeck[14] = deck[43];
                newdeck[15] = deck[48];
                newdeck[16] = deck[27];
                newdeck[17] = deck[18];
                newdeck[18] = deck[1];
                newdeck[19] = deck[31];
                newdeck[20] = deck[14];
                newdeck[21] = deck[0];
                newdeck[22] = deck[21];
                newdeck[23] = deck[12];
                newdeck[24] = deck[41];
                newdeck[25] = deck[35];
                newdeck[26] = deck[16];
                newdeck[27] = deck[4];
                newdeck[28] = deck[9];
                newdeck[29] = deck[40];
                newdeck[30] = deck[25];
                newdeck[31] = deck[34];
                newdeck[32] = deck[44];
                newdeck[33] = deck[7];
                newdeck[34] = deck[5];
                newdeck[35] = deck[38];
                newdeck[36] = deck[46];
                newdeck[37] = deck[37];
                newdeck[38] = deck[49];
                newdeck[39] = deck[39];
                newdeck[40] = deck[23];
                newdeck[41] = deck[50];
                newdeck[42] = deck[20];
                newdeck[43] = deck[2];
                newdeck[44] = deck[11];
                newdeck[45] = deck[47];
                newdeck[46] = deck[28];
                newdeck[47] = deck[17];
                newdeck[48] = deck[30];
                newdeck[49] = deck[8];
                newdeck[50] = deck[29];
                newdeck[51] = deck[32];
                break;
        }
    printf("Leaving shuffle\n");
    //return the shuffled deck
    return newdeck; 
    }
    
    
    int main(void)
    {  //declare a deck of cards. 
       int deck = {'2S', '3S', '4S', '5S', '6S', '7S', '8S', '9S', 'TS', 'JS', 'QS', 'KS', 'AS', '2H', '3H', '4H', '5H', '6H', '7H', '8H', '9H', 'TH', 'JH', 'QH', 'KH', 'AH', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 'AC', '2D', '3D', '4D', '5D', '6D', '7D', '8D', '9D', 'TD', 'JD', 'QD', 'KD', 'AD'};
       //a counter
    
       int i;
       //this is here for debugging purposes as well as the other similar occurrences
    
       printf("Entering shuffle\n");
    
       //shuffles the deck
    
       deck = shuffle(deck, 1);
    
       printf("Printing deck\n");
       for ( i = 0 ; i < 52 ; i++ )
       {
          printf("%d ", deck[i]);//print the values in deck (now shuffled and set equal to newdeck from "shuffle" function. I also get the error "Subscripted value is niether array, nor pointer, nor vector."
       }
    
       return 0;
    }