简单二维数组程序中的意外输出
Undesired output in simple 2D array program
作为作业问题,我必须创建一个简单的程序,从标准的 52 张卡片组中输出 5 张 distinct 张卡片。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void deal(char input_array[5][4]);
char deck[52][4]={"AcS","02S","03S","04S","05S","06S","07S","08S","09S","10S","JaS","QuS","KiS",
"AcH","02H","03H","04H","05H","06H","07H","08H","09H","10H","JaH","QuH","KiH","AcD","02D",
"03D","04D","05D","06D","07D","08D","09D","10D","JaD","QuD","KiD","AcC","02C","03C","04C",
"05C","06C","07C","08C","09C","10C","JaC","QuC","KiC"};
main()
{
int index;
char hand[5][4];
deal(hand);
for(index = 0; index < 5; index++){
printf("%s\n", hand[index]);
}
}
void deal(char input_array[5][4])
{
int i, j, randInt, count = 0;
//srand((unsigned int)time(NULL));
srand(time(NULL));
/* outer for loop used to assign 5 cards to array */
for (i = 0; i < 5; i++){
/* random int generated between 0 and 51, so a random card can be picked from the deck array */
randInt = (rand() % 52);
/* inner for loop checks each time whether the card already exists in the input_array. if it exists, count is incremented by 1 */
for(j = 0; j < 5; j++){
if(strcmp(input_array[j], deck[randInt]) == 0){
++count;
}
}
/* after exiting inner for loop, if count is still 0, the card chosen from the deck isn't already in input_array. so it's added to input_array */
if(count == 0){
strcpy(input_array[i], deck[randInt]);
}
}
}
但是一旦我 运行 一遍又一遍,最终我得到 weird/unexpected/random 值(见下面的输出图像)。
http://i.imgur.com/7HBQIwR.jpg
http://i.imgur.com/PgpFoda.jpg
我检查了每一行代码并仔细检查了所有内容。我不知道这里出了什么问题。任何帮助表示赞赏。
您的代码在此处表现出未定义的行为:
if(strcmp(input_array[j], deck [randInt]) == 0){
因为 input_array
未初始化且包含 "garbage" 个值。
要修复它,请更改
for(j = 0; j < 5; j++){
至
for(j = i-1; j >= 0; j--){
同时添加一个 else
部分:
if(count == 0){
strcpy(input_array[i], deck [randInt]);
}
else{
input_array[i][0]='[=13=]';
}
input_array[i][0]='[=16=]';
完成 NUL 终止 input_array[i]
以便它得到初始化并且 main
中的 printf
不会打印奇怪的东西。
作为作业问题,我必须创建一个简单的程序,从标准的 52 张卡片组中输出 5 张 distinct 张卡片。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void deal(char input_array[5][4]);
char deck[52][4]={"AcS","02S","03S","04S","05S","06S","07S","08S","09S","10S","JaS","QuS","KiS",
"AcH","02H","03H","04H","05H","06H","07H","08H","09H","10H","JaH","QuH","KiH","AcD","02D",
"03D","04D","05D","06D","07D","08D","09D","10D","JaD","QuD","KiD","AcC","02C","03C","04C",
"05C","06C","07C","08C","09C","10C","JaC","QuC","KiC"};
main()
{
int index;
char hand[5][4];
deal(hand);
for(index = 0; index < 5; index++){
printf("%s\n", hand[index]);
}
}
void deal(char input_array[5][4])
{
int i, j, randInt, count = 0;
//srand((unsigned int)time(NULL));
srand(time(NULL));
/* outer for loop used to assign 5 cards to array */
for (i = 0; i < 5; i++){
/* random int generated between 0 and 51, so a random card can be picked from the deck array */
randInt = (rand() % 52);
/* inner for loop checks each time whether the card already exists in the input_array. if it exists, count is incremented by 1 */
for(j = 0; j < 5; j++){
if(strcmp(input_array[j], deck[randInt]) == 0){
++count;
}
}
/* after exiting inner for loop, if count is still 0, the card chosen from the deck isn't already in input_array. so it's added to input_array */
if(count == 0){
strcpy(input_array[i], deck[randInt]);
}
}
}
但是一旦我 运行 一遍又一遍,最终我得到 weird/unexpected/random 值(见下面的输出图像)。
http://i.imgur.com/7HBQIwR.jpg
http://i.imgur.com/PgpFoda.jpg
我检查了每一行代码并仔细检查了所有内容。我不知道这里出了什么问题。任何帮助表示赞赏。
您的代码在此处表现出未定义的行为:
if(strcmp(input_array[j], deck [randInt]) == 0){
因为 input_array
未初始化且包含 "garbage" 个值。
要修复它,请更改
for(j = 0; j < 5; j++){
至
for(j = i-1; j >= 0; j--){
同时添加一个 else
部分:
if(count == 0){
strcpy(input_array[i], deck [randInt]);
}
else{
input_array[i][0]='[=13=]';
}
input_array[i][0]='[=16=]';
完成 NUL 终止 input_array[i]
以便它得到初始化并且 main
中的 printf
不会打印奇怪的东西。