C语言问题 求解 字符串输出中文

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
struct sanguo
{
char * country; //国家
char * name; //名字
int * force; //武力
int * Intelligence; //智力
int len;
int cnt;
};

void init_arr(struct sanguo *pArr, int length);
void show_arr(struct sanguo *pArr);
bool is_empty(struct sanguo *pArr);
bool append_arr(struct sanguo *pArr, char val1, char val2, int val3, int val4);

int main(void)
{
struct sanguo arr;
init_arr(&arr, 50); //创建一个人物基本信息的数组
show_arr(&arr);
append_arr(&arr, '哈', 'z', 225, 200);
show_arr(&arr);

return 0;
}

void init_arr(struct sanguo *pArr, int length)
{
pArr->country = (char*)malloc(sizeof(char)*length);
pArr->name = (char*)malloc(sizeof(char)*length);
pArr->force = (int*)malloc(sizeof(int)*length);
pArr->Intelligence = (int*)malloc(sizeof(int)*length);

if ((NULL == pArr->country)||(NULL == pArr->name)||(NULL == pArr->force)||(NULL == pArr->Intelligence))
{
printf("动态内存分配失败\n");
exit(-1);
}
//设定 数组的元素个数为0 因为目前没有添加 长度 为MAIN函数中设定
else
{
pArr->cnt = 0;
pArr->len = length;
}
return ;
}

void show_arr(struct sanguo *pArr)
{
if (is_empty(pArr))
{
printf("数组为空\n");
}
else
{
for(int i=0; i<pArr->cnt; ++i)
{
printf("国家: %c\0", pArr->country[i]);
printf("姓名: %c\0", pArr->name[i]);
printf("武力值: %d", pArr->force[i]);
printf("智力值: %d", pArr->Intelligence[i]);
printf("\n");
}
}
}
bool append_arr(struct sanguo *pArr, char val1, char val2, int val3, int val4)
{
if (is_full(pArr))
return false;
else
{
pArr->country[pArr->cnt] /*此处一定要有一个pArr->cnt的下标*/ = val1;
pArr->name[pArr->cnt] = val2;
pArr->force[pArr->cnt] = val3;
pArr->Intelligence[pArr->cnt] = val4;
pArr->cnt++;
return true;
}
}
字数打不下 我把几个不重要的函数去掉了 请忽略这个问题
我只想知道 怎么输出中文啊 !!
输出结果是:
数组为空
国家: ;彰? z武力值: 225智力值: 200

struct sanguo 实际上在维护一个结构体数组,这一点从show_arr函数看起来最明显。
其中int len;    //这记录着当前struct sanguo能存放的最大数量int cnt;    //这用于控制结构体数组的长度
其余的char * country;  //国家char * name;//名字int * force;//武力int * Intelligence;//智力
用数组记录了每个元素结构中的成员。即: country[0], name[0], force[0], Intelligence[0]为第一个结构体的内容,这样看来country[0]和name[0]的类型为char,问题在于单个的char无法记录中文,因为每个汉字占两个char。如果要记录多个字符需要char *。
不讨论这个设计是否合理(至少很容易导致本问题出现),简单的修改一下是可以记录中文的,代码如下:

  

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

struct sanguo
{
char ** country; //  国家
char ** name; //  名字
int * force; //  武力
int * Intelligence; //  智力
int len;
int cnt;
};

void init_arr(struct sanguo *pArr, int length);
void show_arr(struct sanguo *pArr);
bool append_arr(struct sanguo *pArr, const char * val1, const char * val2, int val3, int val4);

int main(void)
{
struct sanguo arr;
init_arr(&arr, 50); // 创建一个人物基本信息的数组 
show_arr(&arr);
append_arr(&arr, "哈", "z", 225, 200);
show_arr(&arr);

return 0;
}

void init_arr(struct sanguo *pArr, int length)
{
pArr->country = (char **)malloc(sizeof(char *)*length);
pArr->name = (char**)malloc(sizeof(char *)*length);
pArr->force = (int*)malloc(sizeof(int)*length);
pArr->Intelligence  = (int*)malloc(sizeof(int)*length);

if ((NULL == pArr->country)||(NULL == pArr->name)||(NULL == pArr->force)||(NULL == pArr->Intelligence))
{
printf("动态内存分配失败\n");
exit(-1);
}
// 设定 数组的元素个数为0  因为目前没有添加  长度 为MAIN函数中设定
else
{
pArr->cnt = 0;
pArr->len = length;
}
return ;
}

void show_arr(struct sanguo *pArr)
{
if (is_empty(pArr))
{
printf("数组为空\n");
}
else
{
for(int i=0; i<pArr->cnt; ++i)
{
printf("国家: %s", pArr->country[i]);
printf("姓名: %s", pArr->name[i]);
printf("武力值: %d", pArr->force[i]);
printf("智力值: %d", pArr->Intelligence[i]);
printf("\n");
}
}
}
bool append_arr(struct sanguo *pArr, const char * val1, const char * val2, int val3, int val4)
{
if (is_full(pArr))
return false;
else
{
pArr->country[pArr->cnt] =  strdup(val1);
pArr->name[pArr->cnt] = strdup(val2);
pArr->force[pArr->cnt] = val3;
pArr->Intelligence[pArr->cnt] = val4;
pArr->cnt++;
return true;
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-09
printf("国家: %s", pArr->country[i]);
printf("姓名: %s", pArr->name[i]);追问

不行啊 哥哥 改你这样后 直接运行就出错 !!

追答

你main中直接调用

printf("国家: %s", "直接调用");

看看,
应该是你其他地方问题

追问

直接调用 要改的太多了 我就是想利用那个函数 以后也可以 通过吊用那个函数 来输出整个数组啊

追答

pArr->country[i] 怎么赋值的?

相似回答