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

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,纠结了。大家帮忙看下哈~谢了
...全文
242 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);?
还是怎么怎么样的。。帮下了~谢了
代码下载地址: https://pan.quark.cn/s/f12cd2ca57dd 我的世界开发者中文指南 MCBBS关站致使大量教程失效,恳请各位读者协助指南联系相关作者及时迁移教程。 点击右上方的“Watch”按钮以实时获取中文指南的更新情况,点击右上方“Star”按钮以支持中文指南的编撰。 欢迎各位在此提交各类我的世界开发相关教程、资料、文档、类库。 欢迎加入我的世界开发讨论Q群:345538010 发布定制或承接定制请加入我的世界定制交流Q群:1047988033 目录 提问的方法 常用网站与资源 Java基础 Forge模组 NeoForge模组 Bukkit/Spigot插件 Fabric模组 BungeeCord插件 Sponge插件 数据包 Java版启动器 基岩版服务端 基岩版Addons 基岩版模组 网易基岩版 着色器包 过时资源 版权声明 提问的方法 当你遇到使用搜索引擎、查阅相关文档、进行Debug(如果没有做过上述操作的话,请立刻去做)也无法解决的问题的时候,你可能会向他人求助。 当你提问时,请确保你准确提供了以下信息: 准确描述你的需求和实际问题情况。 准确描述你所在的平台的信息。 例如: - Java 版本 - 所用开发工具及其版本(如IntelliJ IDEA、Eclipse) - 所用自动化构建工具及其版本(如Maven、Gradle) - Minecraft 版本 - Bukkit/Spigot/Forge/Sponge/Fabric 任一所在平台及其版本 - 依赖的类库、模组或插件及其版本 提供你的源代码或SSCCE(最小化、完整、可验证的问题示例),将源代码包括项目描述文件完整上传至源码托管平台(如码云、)。 提供你的完整日...
内容概要:本文围绕综合能源系统中的经济-碳协调问题,提出了一种基于IEEE33节点系统的最优调度与灵敏度分析方法,并提供了完整的Matlab代码实现。研究构建了包含光热电站、有机朗肯循环、P2G(电转气)等多种能源形式的综合能源系统模型,重点探讨在“双碳”目标背景下系统运行的经济性与环保性协同优化问题。通过建立多目标优化模型,结合粒子群算法(PSO)或改进的多目标粒子群算法(MOPSO)进行求解,实现了对系统出力、储能调度、碳排放等关键变量的全局优化。同时,进一步开展了针对风光出力不确定性、负荷波动及电价变化等多重外部因素的灵敏度分析,评估其对系统总成本与碳排放强度的影响机制。该资源配套提供完整的仿真代码、详细的技术文档及测试数据,便于用户复现结果并拓展至其他应用场景。; 适合人群:具备电力系统、能源系统或优化理论基础的研究生、科研人员及从事综合能源系统规划与运行的工程技术工作者;熟悉Matlab编程环境,希望深入掌握低碳调度建模、智能优化算法应用以及多能互补系统协同机制的学习者。; 使用场景及目标:①开展面向低碳目标的综合能源系统最优调度仿真研究;②掌握多目标优化模型在复杂能源系统中的建模与求解方法;③学习粒子群等智能优化算法在电力能源系统中的具体实现与参数整定技巧;④进行不确定性因素对系统经济性和碳排放影响的灵敏度与鲁棒性分析;⑤为高水平学术论文撰写、科研项目申报或实际工程方案设计提供可靠模型支撑和技术参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块学习,重点关注目标函数构造、约束条件设定及算法求解流程,动手调试程序并尝试调整参数以观察优化结果的变化规律。同时推荐延伸阅读碳交易机制、鲁棒优化理论与多能协同调控策略等相关文献,深化对模型物理意义与政策内涵的理解,从而提升研究成果的实际应用价值与学术深度。

70,037

社区成员

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

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