关于从汉字字符串中取一个汉字的问题

Athenacle_ 2011-05-31 03:51:09
大家好,我想问个问题。。我想写一个随机产生中文名字的函数,,,

TCHAR* CreateName(TCHAR* family_name,int num_famaily,TCHAR* useful_word,int num_useful,TCHAR *name)
{
wprintf(L"%s\n",useful_word);
wprintf(L"%s\n",family_name);//放这两个输出语句以确认传参正确
//。。。。
return name;
}


family_name指向一个数组,储存着一个姓氏的列表,num_famaily是这个数组的长度,
useful_word指向一个数组,储存着一些姓名中的常用字,num_useful是长度,
name是一个指针,本来是应该储存着姓名返回的。。。

现在就问一个问题,,我纠结两天了,,还没想明白,,就是如何在这个汉字数组中取一个字,并打印到标准输出。。

一直写不出来。网上的什么方法都试过了。。诶。。

环境中没有定义_UNICODE 和UNICODE,用ANSI写的~

诶。。第一次写这种关于汉字编码的程序,,什么UNICODE,MBCS,纠结了。大家帮忙看下哈~谢了
...全文
203 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-06-01
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>
#include <wchar.h>
#include <string.h>
#include <locale.h>

int main()
{
setlocale(LC_ALL,"chs");

wchar_t str[]=L"中国人";
wchar_t buf[100];

wsprintf(buf,L"%c%c\n",str[0],str[2]);
wprintf(L"%s",buf);

return 0;
}
suisui008 2011-06-01
  • 打赏
  • 举报
回复
试了下 windows 上的内码是ascii 汉字的多字节就是双字节连用
linux下是utf8 我实验的结果是三个字节连用 因为只有一组数据 也不好意思猜测了 但是utf8是可变字节的 越是不常用的字符它的utf8越长
cdwill 2011-05-31
  • 打赏
  • 举报
回复
要看编码的,一般默认是GBK,一个汉字占两个字节或者三个字节,自己搜一下GBK的编码方式就知道了,我印象中是根据第一个字节的范围确定占多少个字节的
辰岡墨竹 2011-05-31
  • 打赏
  • 举报
回复
控制台的话,如果你是ANSI方式的,直接用ANSI标准C库函数,比如printf什么的。用char *什么的。用cout也可以。
可以直接输出的。
但是如果你是Unicode方式的话,需要_T()或L""方式标记字符串是Unicode的。而且需要用wprintf或wcout,前者直接setlocale(LC_CTYPE, "");设置输出用本地语言或者".936";后者需要wcout.imbue(locale(locale(),"",LC_CTYPE));这样的。但是切忌,这两种输出方式不能混合使用,一个设置了本地语言,另外一个就不能用了。
suisui008 2011-05-31
  • 打赏
  • 举报
回复
上面说错了 应该ascii
suisui008 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]

引用 3 楼 loaden 的回复:

否则要用两个%c,例如:
C/C++ code
#include <stdio.h>

char *buf = "中国人";

void main()
{
printf("%c%c", buf[0], buf[1]);
}


这个用的是多字节,应该是utf-8编码,不定长的,长度是1~6字节。
建议lz用unicode,也就……
[/Quote]
乱说 你这个是ansi 只不过是双字节连用 和字符的区别就是每个字节的第一位 一种是0 一种是1
vcf_reader 2011-05-31
  • 打赏
  • 举报
回复
建议用Unicode
nencc 2011-05-31
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void RandName(char *pc1,char *pc2,char *pc3)
{
int n;
n=rand()%strlen(pc1);
n&=~1;
printf("%c%c",*(pc1+n),*(pc1+n+1));

n=rand()%strlen(pc2);
n&=~1;
printf("%c%c",*(pc2+n),*(pc2+n+1));

n=rand()%strlen(pc3);
n&=~1;
printf("%c%c ",*(pc3+n),*(pc3+n+1));
}
void main()
{
char szX[]="赵钱孙李周武正王";
char szM1[]="才成承德博波宾安";
char szM2[]="捷良艺英哲俊和弘化济礼龙仁双天文业益荫周安弼德恩福基教平嗣天望宣颜业悦允运载泽志";
srand(time(0));
for (int i=0;i<1600;i++)
{
if(i%10==0)printf("\n");
RandName(szX,szM1,szM2);
}
printf("\n");
}
如此美丽的你 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
lz代码
1,不要用TCHAR,没设_UNICODE的话,TCHAR对应char,而你代码里用的都是宽字符版本。直接用wchar_t。如果你一定要用TCHAR,那么代码也改成
tprintf(_T("%s\n"),useful_word);
这些是TCHAR的对应版本。
2,unicode下,如果显示不出中文,用setlocale设置下环境。
[/Quote]
++
Athenacle_ 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]

一个汉字两个字节。
要输出,还是用%s参数:但字符串长度就是3,里面放一个汉字,和一个0
[/Quote]

你能不能给一个用%s参数的语句啊?我自己写了一下,貌似不可以,谢了~~
luciferisnotsatan 2011-05-31
  • 打赏
  • 举报
回复
lz代码
1,不要用TCHAR,没设_UNICODE的话,TCHAR对应char,而你代码里用的都是宽字符版本。直接用wchar_t。如果你一定要用TCHAR,那么代码也改成
tprintf(_T("%s\n"),useful_word);
这些是TCHAR的对应版本。
2,unicode下,如果显示不出中文,用setlocale设置下环境。

keshuichonglx 2011-05-31
  • 打赏
  • 举报
回复
建议在程序开始时加入setlocale(LC_ALL, NULL);
而且环境中没有定义_UNICODE 和UNICODE,楼主用TCHAR *来声明参数,但是还把这个参数当UNICODE类型来用,总感觉不好
老邓 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]

引用 3 楼 loaden 的回复:

否则要用两个%c,例如:
C/C++ code
#include <stdio.h>

char *buf = "中国人";

void main()
{
printf("%c%c", buf[0], buf[1]);
}


这个用的是多字节,应该是utf-8编码,不定长的,长度是1~6字节。
建议lz用unicode,也就……
[/Quote]
看源码的编码格式了。
如果是GBK,就是2字节,如果是utf-8,就是三字节。
luciferisnotsatan 2011-05-31
  • 打赏
  • 举报
回复
wchar_t *buf = L"中国人";
setlocale(LC_ALL, "chs");
wprintf(L"%c%c", buf[0], buf[2]);
luciferisnotsatan 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loaden 的回复:]

否则要用两个%c,例如:
C/C++ code
#include <stdio.h>

char *buf = "中国人";

void main()
{
printf("%c%c", buf[0], buf[1]);
}
[/Quote]

这个用的是多字节,应该是utf-8编码,不定长的,长度是1~6字节。
建议lz用unicode,也就是wchar_t,这个是定长的。

输出用wprintf。可能要先setlocale下
老邓 2011-05-31
  • 打赏
  • 举报
回复
这样就输出两个汉字了,楼主对比下:
#include <stdio.h>

char *buf = "中国人";

void main()
{
printf("%c%c%c%c", buf[0], buf[1], buf[4], buf[5]);
}
老邓 2011-05-31
  • 打赏
  • 举报
回复
否则要用两个%c,例如:
#include <stdio.h>

char *buf = "中国人";

void main()
{
printf("%c%c", buf[0], buf[1]);
}
老邓 2011-05-31
  • 打赏
  • 举报
回复
一个汉字两个字节。
要输出,还是用%s参数:但字符串长度就是3,里面放一个汉字,和一个0
Athenacle_ 2011-05-31
  • 打赏
  • 举报
回复
比如说family_name中的第一个字是“赵”,那怎么样可以把这个赵字打印出来呢?
wprintf(L"%c",*family_name);?
printf("%c",*family_name);?
putchar(*family_name);?
putwchar(*family_name);?
还是怎么怎么样的。。帮下了~谢了

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧