C中从常量字符指针数组打印的垃圾字符串
我试图从const char指针数组打印出选中的字符串,但显示的文本绝对是垃圾。我不确定出了什么问题。为了便于阅读,我将代码浓缩如下:C中从常量字符指针数组打印的垃圾字符串,c,arrays,pointers,char,constants,C,Arrays,Pointers,Char,Constants,我试图从const char指针数组打印出选中的字符串,但显示的文本绝对是垃圾。我不确定出了什么问题。为了便于阅读,我将代码浓缩如下: #pragma once #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #define HAND_CARDS 5 /* maximum number of cards any particula
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define HAND_CARDS 5 /* maximum number of cards any particular Hand */
typedef struct card {
int suit;
int face;
} Card;
typedef struct hand {
struct card pHand[5];
int hQuality;
} Hand;
void print_pHand(struct hand player, const char* suit[], const char* face[]);
int main(void)
{
/* initialize memory arrays of suit and face, to be referenced through out the game */
const char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};
const char *face[13] = {"Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Jack", "Queen", "King"};
int deck[4][13] = { 0 };
Hand pHuman = { 0 };
print_pHand(pHuman, suit, face);
return 0;
}
void print_pHand(struct hand player, const char* suit[], const char* face[])
{
int f = 0, s = 0, i = 0;
for (i = 0; i < HAND_CARDS; ++i) {
s = player.pHand[i].suit;
f = player.pHand[i].face;
printf("[%s : %s]\t", suit[s], face[f]);
}
}
似乎有内存访问问题,但我不知道如何解决它
注意:假设这些牌已经随机分配给每个玩家,尽管我可能错过了一些重要的部分。因此,有关完整代码,请查看我的github:
代码中的这一行
printf("[%5s : %-8s%c", suit[s], face[f]);
向
printf()
传递的参数数量不足。由于调用中有三个'%'
,printf()
需要另外三个参数,而不是两个。但是,由于printf()
是作为一个变量函数实现的,它不知道您实际传递给它的参数有多少,因此它设法访问了一些内存,而您不存在的第三个参数可能会占用这些内存,从而导致错误。代码中的这一行
printf("[%5s : %-8s%c", suit[s], face[f]);
向
printf()
传递的参数数量不足。由于调用中有三个'%'
,printf()
需要另外三个参数,而不是两个。但是,由于printf()
是作为一个可变函数实现的,它不知道您实际向它传递了多少个参数,因此它设法访问了一些内存,而您不存在的第三个参数可能会占用这些内存,从而导致错误。@karln createt pHuman被初始化为零。“[%5s:%-8s%c”
不需要3个参数2@Vlad来自莫斯科,但结构的内部参数是整数。所以初始化为零与否无关紧要?另外,我使用索引来定位数组的块,从中存储字符串。@karln create我的意思是调用没有多大意义。在printf调用中,您也使用了in正确的参数数量。这是一个最小的完整可验证示例发挥作用的地方。将其删减,但验证删减版本是否显示有问题的行为。如果没有,则应给出问题实际所在的提示。@karln createt pHuman用零初始化。“[%5s:%-8s%c”
不需要3个参数2@Vlad来自莫斯科,但结构的内部参数是整数。所以初始化为零与否无关紧要?另外,我使用索引来定位数组的块,从中存储字符串。@karln create我的意思是调用没有多大意义。在printf调用中,您也使用了in正确的参数数量。这是一个最小的完整可验证示例发挥作用的地方。将其删减,但验证删减版本是否显示了所讨论的行为。如果没有,则应向您提供问题实际所在的提示。谢谢。这很有意义。谢谢。这很有意义。