Linux中c语言中汉字字符串的输出
#include<stdio.h>intmain(){inti;chara[10][3]={"一","和","三","四","物","社","嗯","阶","己","嗯"...
#include<stdio.h>
int main()
{
int i;
char a[10][3]={"一","和","三","四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
}
output
一和三四物社嗯阶己嗯
和三四物社嗯阶己嗯
三四物社嗯阶己嗯
四物社嗯阶己嗯
物社嗯阶己嗯
社嗯阶己嗯
嗯阶己嗯
阶己嗯
己嗯
嗯
本人想法是单个输出,可是结果却是上面的output
请大侠指教 展开
int main()
{
int i;
char a[10][3]={"一","和","三","四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
}
output
一和三四物社嗯阶己嗯
和三四物社嗯阶己嗯
三四物社嗯阶己嗯
四物社嗯阶己嗯
物社嗯阶己嗯
社嗯阶己嗯
嗯阶己嗯
阶己嗯
己嗯
嗯
本人想法是单个输出,可是结果却是上面的output
请大侠指教 展开
5个回答
2011-04-15
展开全部
程序功能:查询IP
使用方法:
将IP库保存为c:\data.txt,将要查询的IP保存为c:\ip.txt;编译好本程序后,运行后产生c:\result.txt结果文件
程序BUG:data文件最后需要以两个换行结束
*/
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#define TOTAL_INFO 100
extern void str_init(char* str1, char* str2, char* str3, char* str4); //字符串初始化函数
extern void str_init_total_info(char *str);
extern int read_file(FILE *fp, char *str); //读取IP
extern void read_dt2_next(FILE *fp, char *str); //单独保存数据库中第二IP段,最大IP范围
extern void next_line_data(FILE *fp); //专用:跳到下一行
extern void next_line_ip(FILE *fp);
extern int total_line(FILE *fp); //检测文件总行数
int main(int argc, char *argv[])
{
FILE *fp_data, *fp_ip, *fp_result;
char t_dt1[5], t_dt2[5], t_dt3[5], t_dt4[5];
char t_ip1[5], t_ip2[5], t_ip3[5], t_ip4[5]; //4个IP段,便于比较和保存
char t_dt2_next[5]; //保存数据库中同一行第二IP段,最大IP范围
char addr_ip[50]; //输出处理后的IP归属地
char temp;
char ip_total_info[30];
int flag_loop_ip=1, flag_loop_data=1;
int i=0, j=0, k=0, flag_complete=0;
int len_dt1, len_dt2;
int len_ip1, len_ip2;
int total_line_nu=0;
str_init(t_dt1, t_dt2, t_dt3, t_dt4); //初始化:将字符串以'\0'填充
str_init(t_ip1, t_ip2, t_ip3, t_ip4);
str_init_total_info(ip_total_info);
fp_data=fopen("c:\\data.txt", "r");
fp_ip=fopen("c:\\ip.txt", "r");
fp_result=fopen("c:\\result.txt", "a+"); //追加文件,若存在
total_line_nu=total_line(fp_ip); //获取ip.txt文件的总行数
fseek(fp_ip, 0, SEEK_SET); //将fp_ip移动到文件开头
for(i=0; i<total_line_nu; i++) //外层总循环,由ip.txt文件的总行数控制
{
flag_complete=0;
len_ip1=read_file(fp_ip, t_ip1);
len_ip2=read_file(fp_ip, t_ip2);
read_file(fp_ip, t_ip3);
read_file(fp_ip, t_ip4);
for(j=0; flag_complete == 0; j++) //内层总循环,控制条件:是否完成一次比较
{
len_dt1=read_file(fp_data, t_dt1); //读取各段IP,并保存各段IP长度
len_dt2=read_file(fp_data, t_dt2);
read_file(fp_data, t_dt3);
read_file(fp_data, t_dt4);
read_dt2_next(fp_data, t_dt2_next); //单独保存数据库中第二IP段,最大IP范围
fseek(fp_data,9,SEEK_CUR); //文件指针后移9位,指向汉字将要出现的地方
fgets(addr_ip, 20 , fp_data); //单独保存IP信息(汉字)
for(k=0; (temp=fgetc(fp_data)) != '\n'; k++) //此处为了使主程序的内层循环自动换行
{
}
// fseek(fp_data,2,SEEK_CUR); //使fp_data指向下一行
// next_line(fp_data);
if(len_dt1==len_ip1 && len_dt2==len_ip2) //如果各段IP都一样长,则比较
{
if( !strcmp(t_dt1, t_ip1) ) //如果第一段的IP内容一样,比较第二段
{
if( ((strcmp(t_dt2, t_ip2)) <= 0) && ((strcmp(t_dt2_next, t_ip2)) >= 0) )
{ //如果要查询IP在这个IP段(BUG为:最小范围和最大范围个数不一样)
flag_complete = 1; //完成一次循环
strcpy(ip_total_info,t_ip1); //整理要输出的信息
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip2);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip3);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip4);
strcat(ip_total_info,"\t");
strcat(ip_total_info,addr_ip);
fputs(ip_total_info, fp_result);
fseek(fp_data, 0, SEEK_SET); //将fp_data移动到文件开头
}
}
}
//不满足条件时返回循环,因为readfile函数的设置,不用再重置到下一行
}
}
// printf("ftell:%d\n",ftell(fp_data)); //获取文件流的读取位置
// fseek(fp,2,SEEK_CUR); //
fclose(fp_data);
fclose(fp_ip);
fclose(fp_result);
return 0;
}
void str_init(char *str1, char *str2, char *str3, char *str4)
{
int i;
for(i=0; i<5; i++)
{
str1[i]='\0';
str2[i]='\0';
str3[i]='\0';
str4[i]='\0';
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int read_file(FILE *fp, char* str)
{
int i, len;
char t;
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}
str[i] = '\0'; //将最后读取的非数字填充掉
len=strlen(str);
return len;
}
void read_dt2_next(FILE *fp, char *str) //单独保存数据库中第二IP段,最大IP范围
{
char temp;
int flag=0,i;
for (i=0; flag != 1; i++ ) //直到找到第二段最大范围IP
{
temp = fgetc(fp);
if(temp == '.') //第二段IP以第一段的.开始
{
flag = 1;
}
}
//保存找到的第二段最大范围IP
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}
str[i] = '\0'; //将最后读取的非数字填充掉
}
void next_line_data(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");
t=fgetc(fp);
}
t=fgetc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
else
{
t=getc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
}
//fseek(fp,4,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行
}
void next_line_ip(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");
t=fgetc(fp);
}
fseek(fp,2,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行
}
int total_line(FILE *fp) //检测总行数
{
char t1, t2;
int flag=0, flag2=0;
t1 = fgetc(fp);
t2 = fgetc(fp);
while (t1 != EOF) //到达文件尾或出错返回EOF
{
if( (t1 == '\n') && (t1=fgetc(fp) != EOF))
{
flag2=0;
flag+=1;
}
else flag2=1;
t1 = fgetc(fp);
}
flag=flag+flag2;
return flag;
}
void str_init_total_info(char *str)
{
int i;
for(i=0; i<TOTAL_INFO; i++)
{
str[i]='\0';
}
}
另外,团IDC网上有许多产品团购,便宜有口碑
使用方法:
将IP库保存为c:\data.txt,将要查询的IP保存为c:\ip.txt;编译好本程序后,运行后产生c:\result.txt结果文件
程序BUG:data文件最后需要以两个换行结束
*/
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#define TOTAL_INFO 100
extern void str_init(char* str1, char* str2, char* str3, char* str4); //字符串初始化函数
extern void str_init_total_info(char *str);
extern int read_file(FILE *fp, char *str); //读取IP
extern void read_dt2_next(FILE *fp, char *str); //单独保存数据库中第二IP段,最大IP范围
extern void next_line_data(FILE *fp); //专用:跳到下一行
extern void next_line_ip(FILE *fp);
extern int total_line(FILE *fp); //检测文件总行数
int main(int argc, char *argv[])
{
FILE *fp_data, *fp_ip, *fp_result;
char t_dt1[5], t_dt2[5], t_dt3[5], t_dt4[5];
char t_ip1[5], t_ip2[5], t_ip3[5], t_ip4[5]; //4个IP段,便于比较和保存
char t_dt2_next[5]; //保存数据库中同一行第二IP段,最大IP范围
char addr_ip[50]; //输出处理后的IP归属地
char temp;
char ip_total_info[30];
int flag_loop_ip=1, flag_loop_data=1;
int i=0, j=0, k=0, flag_complete=0;
int len_dt1, len_dt2;
int len_ip1, len_ip2;
int total_line_nu=0;
str_init(t_dt1, t_dt2, t_dt3, t_dt4); //初始化:将字符串以'\0'填充
str_init(t_ip1, t_ip2, t_ip3, t_ip4);
str_init_total_info(ip_total_info);
fp_data=fopen("c:\\data.txt", "r");
fp_ip=fopen("c:\\ip.txt", "r");
fp_result=fopen("c:\\result.txt", "a+"); //追加文件,若存在
total_line_nu=total_line(fp_ip); //获取ip.txt文件的总行数
fseek(fp_ip, 0, SEEK_SET); //将fp_ip移动到文件开头
for(i=0; i<total_line_nu; i++) //外层总循环,由ip.txt文件的总行数控制
{
flag_complete=0;
len_ip1=read_file(fp_ip, t_ip1);
len_ip2=read_file(fp_ip, t_ip2);
read_file(fp_ip, t_ip3);
read_file(fp_ip, t_ip4);
for(j=0; flag_complete == 0; j++) //内层总循环,控制条件:是否完成一次比较
{
len_dt1=read_file(fp_data, t_dt1); //读取各段IP,并保存各段IP长度
len_dt2=read_file(fp_data, t_dt2);
read_file(fp_data, t_dt3);
read_file(fp_data, t_dt4);
read_dt2_next(fp_data, t_dt2_next); //单独保存数据库中第二IP段,最大IP范围
fseek(fp_data,9,SEEK_CUR); //文件指针后移9位,指向汉字将要出现的地方
fgets(addr_ip, 20 , fp_data); //单独保存IP信息(汉字)
for(k=0; (temp=fgetc(fp_data)) != '\n'; k++) //此处为了使主程序的内层循环自动换行
{
}
// fseek(fp_data,2,SEEK_CUR); //使fp_data指向下一行
// next_line(fp_data);
if(len_dt1==len_ip1 && len_dt2==len_ip2) //如果各段IP都一样长,则比较
{
if( !strcmp(t_dt1, t_ip1) ) //如果第一段的IP内容一样,比较第二段
{
if( ((strcmp(t_dt2, t_ip2)) <= 0) && ((strcmp(t_dt2_next, t_ip2)) >= 0) )
{ //如果要查询IP在这个IP段(BUG为:最小范围和最大范围个数不一样)
flag_complete = 1; //完成一次循环
strcpy(ip_total_info,t_ip1); //整理要输出的信息
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip2);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip3);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip4);
strcat(ip_total_info,"\t");
strcat(ip_total_info,addr_ip);
fputs(ip_total_info, fp_result);
fseek(fp_data, 0, SEEK_SET); //将fp_data移动到文件开头
}
}
}
//不满足条件时返回循环,因为readfile函数的设置,不用再重置到下一行
}
}
// printf("ftell:%d\n",ftell(fp_data)); //获取文件流的读取位置
// fseek(fp,2,SEEK_CUR); //
fclose(fp_data);
fclose(fp_ip);
fclose(fp_result);
return 0;
}
void str_init(char *str1, char *str2, char *str3, char *str4)
{
int i;
for(i=0; i<5; i++)
{
str1[i]='\0';
str2[i]='\0';
str3[i]='\0';
str4[i]='\0';
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int read_file(FILE *fp, char* str)
{
int i, len;
char t;
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}
str[i] = '\0'; //将最后读取的非数字填充掉
len=strlen(str);
return len;
}
void read_dt2_next(FILE *fp, char *str) //单独保存数据库中第二IP段,最大IP范围
{
char temp;
int flag=0,i;
for (i=0; flag != 1; i++ ) //直到找到第二段最大范围IP
{
temp = fgetc(fp);
if(temp == '.') //第二段IP以第一段的.开始
{
flag = 1;
}
}
//保存找到的第二段最大范围IP
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}
str[i] = '\0'; //将最后读取的非数字填充掉
}
void next_line_data(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");
t=fgetc(fp);
}
t=fgetc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
else
{
t=getc(fp);
if (t != '\n')
{
fseek(fp,-1,SEEK_CUR);
}
}
//fseek(fp,4,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行
}
void next_line_ip(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '\n')
{
// printf("temp t:%c\n", t);
// system("pause");
t=fgetc(fp);
}
fseek(fp,2,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行
}
int total_line(FILE *fp) //检测总行数
{
char t1, t2;
int flag=0, flag2=0;
t1 = fgetc(fp);
t2 = fgetc(fp);
while (t1 != EOF) //到达文件尾或出错返回EOF
{
if( (t1 == '\n') && (t1=fgetc(fp) != EOF))
{
flag2=0;
flag+=1;
}
else flag2=1;
t1 = fgetc(fp);
}
flag=flag+flag2;
return flag;
}
void str_init_total_info(char *str)
{
int i;
for(i=0; i<TOTAL_INFO; i++)
{
str[i]='\0';
}
}
另外,团IDC网上有许多产品团购,便宜有口碑
展开全部
1、计算机用两个字节来表示一个汉字,“我”在内存里就是这样存放的:CE D2。CE是str[0]的内容,D2是str[1]的内容。第一次循环输出str[0],但是这个字符在ASCII字符集里代表这样一个东西(不知道在这儿能不能正常显示),但是Windows的命令提示符程序读取到这里就会自动使用宽字符集,也就是说,它已经准备好读取下一个字符,然后把他们当成一个字符显示出来。于是就出现了那个汉字。
2、例程:
#include <stdio.h>
int main()
{
printf("%c%c",(char)0xce,(char)0xd2);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的字符串都没有终止符号,也就是'/0',这样编译器就会把后面的字符串也算进来。这么写试试:
int i;
char a[10][3]={"一","和","三","四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
a[i][2]='/0';
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
int i;
char a[10][3]={"一","和","三","四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
a[i][2]='/0';
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
追问
你好 我试过了 可是依然没办法解决
加上a[i][2]='\0'时输出为空
定义时“一”不就在后面加了'\0'了吗
请你在详细解释下
谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
。。。。。。。。。。。。。
实验结果,3个似乎存的不对劲
自己运行下面的程序,自己运行一下...就明白了...
感觉现在汉字好像用3个字节才能存储下来了??这样,你用3个字节存就把字符串的结束符给丢掉了...然后打印下来必然是这样的情况了么...
具体我也不太明白...strlen是去掉了结束符的长度...所以,现在看起来似乎是一个汉字占三个字节了....
我的机器:赛扬,32位,arch linux...
#include<stdio.h>
#include<string.h>
int main()
{
int i;
char b[5]="我";
printf("length of b is:%d\n",strlen(b));
char a[10][4]={{"一"},{"和"},{"三"},"四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
}
实验结果,3个似乎存的不对劲
自己运行下面的程序,自己运行一下...就明白了...
感觉现在汉字好像用3个字节才能存储下来了??这样,你用3个字节存就把字符串的结束符给丢掉了...然后打印下来必然是这样的情况了么...
具体我也不太明白...strlen是去掉了结束符的长度...所以,现在看起来似乎是一个汉字占三个字节了....
我的机器:赛扬,32位,arch linux...
#include<stdio.h>
#include<string.h>
int main()
{
int i;
char b[5]="我";
printf("length of b is:%d\n",strlen(b));
char a[10][4]={{"一"},{"和"},{"三"},"四","物","社","嗯","阶","己","嗯"};
for(i=0;i<10;i++)
printf("%s\n",a[i]);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
将a[10][3]改为a[10][4],中文占了3个字节。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询