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]);

定义一个字符串变量,在这个变量的值中就可以输入中文了。汉字是多字节的,一个char放不下,可以使用字符数组,但需要给数组分配空间,或者使用string。

例如:

#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 在寄存器上工作。 XYV的取值范围和数据类型是什么? 需要更多信息。如果这是 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语言怎样才能输出中文???(最简单的方法)的主要内容,如果未能解决你的问题,请参考以下文章

gcc的简单用法

了解数组c ++中最小值位置的最简单方法

在c语言中用最简单的方法把十进制转化为十六进制

* * * * * * * * * * * very good * * * * * * * * * * * 这个东西用c语言得输入啥才能让它输出?

c语言(用最简单的,初学)从键盘输入四个整数,求平均值.数据输入,计算结果和输出要求有注释

收集所有发出的 SQL 的最简单方法