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

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,纠结了。大家帮忙看下哈~谢了
...全文
229 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);?
还是怎么怎么样的。。帮下了~谢了
【顶级EI完美复现】电力系统碳排放流的计算方法【IEEE 14节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE 14节点电力系统的碳排放流计算方法,并提供了Matlab代码实现,属于顶级EI期刊级别的研究成果复现。该方法通过建立电力系统中各节点的碳排放流动模型,结合潮流计算与电源出力特性,量化不同机组和线路的碳排放责任,进而实现对电力系统低碳运行的评估与优化。文中详细阐述了算法原理、数学模型构建及仿真步骤,适用于电力系统低碳化分析与碳足迹追踪研究。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事能源系统低碳化研究的专业技术人员,尤其适合致力于高水平论文复现与算法开发的研究者。; 使用场景及目标:①用于电力系统碳排放流的精确建模与可视化分析;②支撑“双碳”背景下电网低碳调度、绿色电力溯源与碳配额分配等应用场景;③为撰写高水平学术论文(如EI/SCI)提供可复现的技术路径与代码基础。; 阅读建议:建议读者结合IEEE 14节点系统标准数据,逐步运行并调试所提供的Matlab代码,深入理解碳流分配逻辑与矩阵运算实现方式,同时可拓展至其他节点系统以验证算法通用性。
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。

70,036

社区成员

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

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