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

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,纠结了。大家帮忙看下哈~谢了
...全文
224 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);?
还是怎么怎么样的。。帮下了~谢了
在“天池平台二手车交易价值评估竞赛”这一数据科学任务中,参与者需构建预测模型以估算二手车辆的市场成交价。此类赛事属于机器学习与数据分析领域的典型应用场景,旨在系统提升参赛者的特征构建、模型优化及结果验证能力。下文将分模块阐述关键技术要点: 1. 数据清洗与规整 原始数据集需经过系统处理,包括填补空缺数值、识别离群观测、剔除冗余字段,并将分类变量编码为模型可读的数值形式。此阶段质量直接影响后续建模效果。 2. 特征构建与筛选 需从原始字段中提炼有效预测因子,包括但不限于车辆制造厂商、出厂年份、行驶总里程、外观配色及动力系统配置。基于领域常识可衍生新特征,例如车龄换算、年均行驶强度指数等。 3. 数据分布探查 通过统计图表分析变量间关联规律,例如采用趋势线观察里程数与价格的相关性,使用分位数图示不同品牌的价格区间分布特征。 4. 算法模型选型 常用预测架构包括线性回归模型、树型决策结构、集成学习方法(如随机森林、XGBoost、LightGBM)、支持向量机及深度学习网络。需根据数据特性与计算资源进行综合选择。 5. 参数优化流程 采用K折交叉验证评估模型稳定性,配合网格搜索或随机搜索策略进行超参数调优,以最大化模型预测精度。 6. 集成策略应用 通过Bagging、Boosting或堆叠融合等技术整合多个基模型,通常能获得超越单一模型的表现。 7. 性能度量标准 预测任务常用评估指标包括均方误差、平均绝对误差、均方根误差及决定系数。不同业务场景需针对性选择评估体系。 8. 结果输出规范 最终预测结果需按赛事要求整理为特定结构的数据文件,通常包含样本标识符与对应价格预测值两列。 9. 时序特征处理 当数据包含交易时间维度时,需引入时间序列分析方法(如季节性分解、循环神经网络)捕捉市场波动规律。 10. 工程实践规范 采用Git进行版本追踪,通过模块化编程提升代码可维护性,建立标准化实验记录体系。 该竞赛全面覆盖数据预处理、特征工程、模型构建与验证等核心环节,同时强调工程化实施规范,既能强化技术理论认知,又可培养实际业务场景的问题解决能力。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

70,036

社区成员

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

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