我有这两个数组:
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时它可以工作,但如果我在数组中添加或删除项目,我希望它实际工作)
答案 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
。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,这将导致索引越界,导致程序崩溃。