c语言怎样才能输出中文???(最简单的方法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言怎样才能输出中文???(最简单的方法)相关的知识,希望对你有一定的参考价值。
rt,在一个程序中我puts()输出中文名字,带但有些有会多出几个不是我输入的字,怎么才能让它输出正确??
可能没说清楚,我puts()的括号里是一个指针变量(*P),这个变量是用gets(&p)得到的汉字,但用puts(&p)输出有的就会多几个字出来,有的又是正常的.....我想知道怎样才能输出正常。
我是用的vc2003,2005我也有。
->6楼:你的方法我也试了的,还是一样,我发现要是输入一个汉字的话就不会出问题,我把程序(得到名字的函数)放在下面,你们看看是怎么回事啊。
typedef struct
int no;
int ti;
int ip[N];
int c;
char name[21];
bus;
void getdata(bus a[M])
a[0].ti=0;
bus *p;
int m;
p=a;
int n=50101;
for(int i=0;i<M;i++)
n=n+i;
a[i].no=n;
a[i].c=rand()%3+3;
m=a[i].c;
for(int j=0;j<m;j++)
a[i].ip[j]=rand()%81+50;
a[i].ti=a[i].ti+a[i].ip[j];
printf("请输入5010%d车名:",i+1);//这里
gets(&(p+i)->name[21]);
sum=sum+a[i].ti;
输出用的是:puts(&(p+i)->name[21]);
例如:
#include<stdio.h>
int main(void)
char a[128];
printf("请输入所需输出的汉字:");
scanf("%s",a);
printf("%s\n",a);
return 0; 参考技术A 在C程序中显示汉字
在许多C程序设计中,要用到汉字进行提示或人机交互,而现行的Turbo C集成开发环境不是汉化的,如何编制能显示汉字的C程序呢?
下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。
由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。
内码转换成区位码方法如下:
qh=c1-0xa0 wh=c2-0xa0
其区位码就是:
qw=qh*0xff+wh
该汉字在字库中离起点的位置是:
offset=(94*(qh-1)+(wh-1))*32L
程序例:
#include 〈graphics.h〉
#include 〈stdio.h〉
#include 〈fcntl.h〉
#include 〈io.h〉
#include 〈stdlib.h〉
#include 〈conio.h〉
#define ROW 1 //纵坐标放大倍数
#define COL 2 //横坐标放大倍数
void main()
int x,y;
char *s=〃汉字显示程序〃;
FILE *fp;
char buffer[32]; //buffer用来存储一个汉字
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=DETECT,gm; //图形屏幕初始化
initgraph(&gd,&gm,〃 〃);
if ((fp=fopen(〃hzk16〃,〃rb〃))==NULL)
//打开汉字库,该字库可以在ucdos中找到
printf(〃Can't open haz16,Please add it〃);
getch(); closegraph(); exit(0);
x=20; y=100; //显示位置设置
while(*s)
qh=*(s)-0xa0; //汉字区位码
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L; //计算该汉字在字库中偏移量
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)
for (i=0;i〈16;i++) //将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字
for(n=0;n〈ROW;n++)
for(j=0;j〈2;j++)
for(k=0;k〈8;k++)
for(m=0;m〈COL;m++)
if (((buffer[i*2+j]〉〉(7-k))&0x1)!=NULL)
putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,GREEN);
s+=2; //因为一个汉字内码占用两个字节,所以s必须加2
x+=30;
getch();
closegraph();
上述程序在Turbo C 2.0编译系统下运行成功,它可以将汉字放大显示,读者可以将它改成函数用在您的程序中显示汉字。
参考资料:http://www.cqumzh.cn/topic_show.php?tid=28232 参考技术B C语言中,汉字是用字符串来存储的,因为,汉字是多字节组成(GBK字符集一个汉字占两个字节,UTF8字符集,一个汉字占三个字节),所以,标准C中,只能用字符串来存储汉字数据。
可以采用字符串输入函数来输入中文。
判断中文是不是指定数据,可以用strcmp()函数来进行比较
中文输出,可用printf("%s")来输出相应的数据。
参考代码:
#include <stdio.h>
#include <string.h>
void main()
char str[100];
printf("请输入中文: ");
scanf("%s", str );
if ( strcmp(str,"你好")==0 ) //两个字符串相等时,strcmp返回0
printf("我很好\n");
else
printf("你输入的是:%s\n", str );
运行结果:
请输入中文: 你好
我很好
请输入中文: 中国
你输入的是:中国 参考技术C 在C程序中显示汉字在许多C程序设计中,要用到汉字进行提示或人机交互,而现行的Turbo C集成开发环境不是汉化的,如何编制能显示汉字的C程序呢?下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。内码转换成区位码方法如下:qh=c1-0xa0 wh=c2-0xa0其区位码就是:qw=qh*0xff+wh该汉字在字库中离起点的位置是:offset=(94*(qh-1)+(wh-1))*32L程序例:#include 〈graphics.h〉#include 〈stdio.h〉#include 〈fcntl.h〉#include 〈io.h〉#include 〈stdlib.h〉#include 〈conio.h〉#define ROW 1 //纵坐标放大倍数#define COL 2 //横坐标放大倍数void main()int x,y;char *s=〃汉字显示程序〃;FILE *fp;char buffer[32]; //buffer用来存储一个汉字register m,n,i,j,k;unsigned char qh,wh;unsigned long offset;int gd=DETECT,gm; //图形屏幕初始化initgraph(&gd,&gm,〃 〃);if ((fp=fopen(〃hzk16〃,〃rb〃))==NULL)//打开汉字库,该字库可以在ucdos中找到 printf(〃Can't open haz16,Please add it〃);getch(); closegraph(); exit(0);x=20; y=100; //显示位置设置while(*s) qh=*(s)-0xa0; //汉字区位码wh=*(s+1)-0xa0;offset=(94*(qh-1)+(wh-1))*32L; //计 参考技术D 起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。
这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。
K&R C主要介绍了以下特色:
结构体(struct)类型
长整数(long int)类型
无符号整数(unsigned int)类型
把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最 准要求,许多老旧的编译器仍然运行K&R C的标准。
1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。
1983年,美国国家标准协会(ANSI)成立了一个委员会X3J11,来制定 C语言标准。
1989年,美国国家标准协会(ANSI)通过了C语言标准,被称为ANSI X3.159-1989 "Programming Language C"。因为这个标准是1989年通过的,所以一般简称C89标准。有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。
1990年,国际标准化组织(ISO)和国际电工委员会(IEC)把C89标准定为C语言的国际标准,命名为ISO/IEC 9899:1990 - Programming languages -- C 。
因为此标准是在1990年发布的,所以有些人把简称作C90标准。不过大多数人依然称之为C89标准,因为此标准与ANSI C89标准完全等同。
1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C89标准修订版,名叫ISO/IEC 9899:1990/Cor 1:1994,有些人简称为C94标准。
1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity [7] ,有些人简称为C95标准。
我怎样才能从 10 中获得 10000,1000,100 最简单的方法
【中文标题】我怎样才能从 10 中获得 10000,1000,100 最简单的方法【英文标题】:How can i make 10000,1000,100 from 10 the easiest way 【发布时间】:2014-10-13 10:11:44 【问题描述】:我正在寻找上述问题的解决方案。 我需要生成 100,1000 和 10000(十进制数)。 因为整个练习就是计算:
10000*X+1000*Y+100*Y+10*V+1*C
我知道我可以通过 mul 命令做到这一点,但在这种情况下 我必须大量使用堆栈。
我在想某种转移,但不知道怎么做 用十进制数字。
用二进制数
mov al,2h;mov al,10b;
shl al,1
Preferebla 是 masm 环境。感谢您的帮助
更新1: 我不想使用 mul 或 imul(小于 32 位数) 我有一个数字作为字符串(db)让我们说 24575,我有伪代码,没有完成
mov cx,5
Calc:
mov di,offset first
add di,2;so we are on the adress of "2"
;ASCI number is 2 and i want to get 20000
mov al,10d
;than ASCI number is 4 and i want to get 4000
;than ASCI number is 5 and i want to get 500
;than ASCI number is 7 and i want to get 70
;than ASCI number is 5 and i want to get 5
inc di
loop Calc
first:db"A$"
number :db"24575$"
【问题讨论】:
... but in that case i have to work a lot with stack.
- 你的意思可能是fmul
, mul
在寄存器上工作。 X
、Y
、V
的取值范围和数据类型是什么?
需要更多信息。如果这是 32 位或 64 位模式下的大约 32 位数字,您可以将它们 imul
加上常数 10、100 等。
谢谢哈罗德,这是一个简单的程序,使用 mul 和寄存器就足够了。数字小于 32 位 shl 命令会很棒,但我可以生成 10,100,1000 作为二进制数,但我需要得到十进制数。
你可以使用10=8+2
这个事实,所以移位3,移位1,然后将它们相加。或使用10=2*(4+1)
,您可以在32 位模式下使用LEA
计算4+1
。
好吧,但计算 100 和 1000 和 10000 并不是那么简单
【参考方案1】:
要计算10000*X+1000*Y+100*Z+10*V+1*C
,请使用转换10*(10*(10*(10*X+Y)+Z)+V)+C
。这样,您只需在每次迭代中乘以 10。正如我在评论中所写,您可以使用10=8+2
避免mul
。因此,您的代码可能如下所示:
mov cx, 5 ; number of digits
mov di, offset number ; pointer to digits
xor ax, ax ; zero result
next:
mov dx, ax ; save a copy of current result
shl ax, 3 ; multiply by 8
add ax, dx ; 9
add ax, dx ; 10
movzx dx, byte ptr [di] ; fetch digit
sub dx, '0' ; convert from ascii
add ax, dx ; add to sum
inc di ; next digit
loop next
【讨论】:
以上是关于c语言怎样才能输出中文???(最简单的方法)的主要内容,如果未能解决你的问题,请参考以下文章
* * * * * * * * * * * very good * * * * * * * * * * * 这个东西用c语言得输入啥才能让它输出?