(C ++)试图打印出char *数组(我认为)

时间:2013-04-14 18:28:34

标签: c++ arrays char

我有这两个数组:

const char *face[] =
{"Deuce", "Three", "Four", "Five",
 "Six", "Seven", "Eight", "Nine", "Ten",
 "Jack", "Queen", "King", "Ace", "\0"};

const char *suit[] = { " of Hearts", " of Clubs", " of Diamonds", " of Spades", "\0" };    

实际上,由于我在C ++中的表现还不是很好,我甚至不知道你在阵列中使用星号的时间或者其他任何地方......我很感激有人可以解释一下......

但无论如何,问题是我正试图用这样的西装打印出所有可能的卡片:

for (int n = 0; n<strlen(*suit); n++){ //where strlen(*suit) should be 4
for(int i = 0; i<strlen(*face); i++){ //where strlen(*face) should be 13
        cout << endl << face[i] << suit[n] << endl;
    }
}

使用该代码,我的程序崩溃了。我究竟做错了什么? (当使用n&lt; 4和i&lt; 13时它可以工作,但如果我在数组中添加或删除项目,我希望它实际工作)

7 个答案:

答案 0 :(得分:2)

函数strlen传递一个const char*,一个指向以null结尾的字符数组的指针。你不能用它来算出字符串数组的长度。

相反,我建议你这样做:

const char *face[] =
    {"Deuce", "Three", "Four", "Five",
     "Six", "Seven", "Eight", "Nine", "Ten",
     "Jack", "Queen", "King", "Ace", NULL};

所以,sentinel是空指针。像这样的循环:

for (int i=0; face[i]; i++)
    // do something with face[i]

同样对于其他阵列,当然。


现在,所有这些都说明了,对于C ++程序来说,这是错误的。

  • 使用std::string
  • 而不是使用C字符串,指向字符数组的指针
  • 使用标准容器类,而不是使用原始数组来保存字符串。在您的情况下,您需要std::vector<std::string>

我能给你的最好建议是忘记C的做事方式,并尝试学习用C ++编写代码的方法。

答案 1 :(得分:1)

一些事情! 你可以做这个检查:

sizeof(suit)/sizeof(suit[0])

但它会运行一次比你需要的时间长,因为你确实有一个空终止符。因此,要么从套装中删除null终止字符串并使用上面的内容,要么将for更改为:

for (int n = 0; strlen(suit[n]); n++)

同样在脸部阵列上。

答案 2 :(得分:0)

数组的长度不是strlen给出的,因为它的元素不是char,而是char*。换句话说,您的数组不是字符串。

您需要将数组长度存储在单独的变量中,或者只使用std::vector<const char*> face;容器并使用face.size()

答案 3 :(得分:0)

指针数组与char数组不同。 strlen( *suit )返回face数组的第一个元素的长度,该数组是一个字符串。该索引处的字符串长度为11(包括终止字符),这就是为什么它只循环11次。类似地,内部循环只运行5次,因为face的第一个元素处的字符串长度为6个字符。

您应该使用std::string的向量代替:

std::vector<std::string> suit{"Deuce", "Three", "Four", "Five",
 "Six", "Seven", "Eight", "Nine", "Ten",
 "Jack", "Queen", "King", "Ace"};


std::vector<std::stirng> face{" of Hearts", " of Clubs", " of Diamonds", " of Spades"};

for (auto a : suit)
{
    for (auto b : face)
    {
        // ...
    }
}

答案 4 :(得分:0)

 const char *face[] =
   {"Deuce", "Three", "Four", "Five",
     "Six", "Seven", "Eight", "Nine", "Ten",
      "Jack", "Queen", "King", "Ace", "\0"};

是一个字符串文字数组。您最好按以下方式声明face

string face[13]= {"Deuce", "Three", "Four", "Five",
     "Six", "Seven", "Eight", "Nine", "Ten",
     "Jack", "Queen", "King", "Ace"};

你不再需要“\ 0”,因为你没有处理c-string(char数组)。

suit你可以这么类似。

 string suit[4] = { " of Hearts", " of Clubs", " of Diamonds", " of Spades"};

您可以按如下方式打印这两个字符串数组:

  for (int n = 0; n<13; n++){ //where strlen(*face) should be 13
      for(int j = 0; j< 4; j++){ //where strlen(*suit) should be 4
          cout << endl << face[n] << suit[j] << endl;
      }
  }

答案 5 :(得分:0)

你的柜台错了

 for (int n = 0; n<4; n++){ 
    for(int i = 0; i<13; i++){ 
        cout << endl << face[i] << suit[n] << endl;
    }
 }

你也可以这样做

 for (int n = 0; strlen(suit[n]) > 0; n++){
    for(int i = 0; strlen(face[i]) > 0; i++){
        cout << endl << face[i] << suit[n] << endl;
    }
 }

答案 6 :(得分:0)

您正在存储指针数组。 *在指针的字体中取消引用该指针并返回该字符串。所以,你第一次调用strlen(* suit)会返回10,这将导致索引越界,导致程序崩溃。