C语言,字符串输出是乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,字符串输出是乱码相关的知识,希望对你有一定的参考价值。

就是要让他选出元音字母,然后复制到第二个字符串中去,刚学C语言,实在有点笨,请各位不吝指教,多谢了。

    主要错误有三个,第一:后面所有的a[students][subiects]变成a[i][j]

    在计算每个同学的总分和平均分的时候要将sum的初值设置为0吧

    在计算平均分的时候,你的语句是ave = sum / students;ave = sum / subiects
    这个是不对的,应改为,ave =1.0* sum / students,ave =1.0* sum / subiects原因在于 假设sum=7,students=3,则ave=7/3=2,而实际想要的结果为2.3333

 

#include<stdio.h>
#define subiects 3  //学科数量
#define students 4  //学生人数
int main(void)

int a[students][subiects] =  53,54,76,87,89,56,76,85,45,75,76,45 ;
int i = 0, j = 0, sum = 0;//sum为总分
double ave;//ave为平均值
//输入成绩

for (i = 0; i < students; i++)

printf("请输入学生%d的%d科成绩:", i + 1, subiects);//i+1为学生序号
for (j = 0; j < subiects; j++)

scanf("%d", &a[i][j]);


//输出成绩
printf("\\t\\tC语言\\t大英\\t高数\\t总分\\t平均分\\n");
for (i = 0; i < students; i++)
    sum=0;
printf("\\t同学%d", i+1);
for (j = 0; j < subiects; j++)

sum += a[i][j];
printf("\\t%d", a[i][j]);

ave = 1.0*sum / subiects;
printf("\\t%d\\t%.2f\\n",sum,ave);

printf("\\n\\n");
//颠倒输出
sum = 0;
ave = 0;
printf("\\t");
for (i = 0; i < students; i++)
printf("\\t同学%d", i + 1);
printf("\\t平均分\\n");
for (j = 0; j < subiects; j++)

if (j == 0)
printf("\\tC语言");
if (j == 1)
printf("\\t大英");
if (j == 2)
printf("\\t高数");
        sum=0;
for (i = 0; i < students; i++)

sum += a[i][j];
printf("\\t%d", a[i][j]);

ave = 1.0*sum / students;
printf("\\t%.2f\\n",ave);

return 0;

参考技术A 字符串使用前请使用清空语句把垃圾内存清理成'\0',也就是0x00(0):
memset(str2, 0x00, sizeof(str2));
当然,也可以在声明的时候进行初始化:
char str2[20] = 0;
这句也能实现同样的效果。这是C语言习惯,务必养成!
'\0'是字符串结束符,每当解释器看到这'\0'才会认为字符串终止,而你的程序明显没有字符串结束符,所以连同垃圾内存一起读出来了。“烫烫。。”等就是垃圾内存。
不明白欢迎追问本回答被提问者和网友采纳
参考技术B 你几个地方写错了,我在里面有注释,分别有:
1、赋值地方,应该是a[i][j],这里i、j代表第几个,你用student这些固定值,一看就知道错了不是吗?而且这是个非常严重的错误,a[i][j]这里面i不能等于student,j不能等于subiects,你们下标取值0到student-1,你自己写完看看都知道错了
2、sum每次循环前要赋0,否则会把前一个学生的成绩加进去
3、ave=sum*1.0/4,不乘1.0的话,系统会把sum/4当成一个整型,会造成结果不正确
#include<stdio.h>
#define subiects 3 //学科数量
#define students 4 //学生人数
int main(void)

int a[students][subiects] = 53,54,76,87,89,56,76,85,45,75,76,45 ;
int i = 0, j = 0, sum = 0;//sum为总分
double ave;//ave为平均值
//输入成绩

for (i = 0; i < students; i++)

printf("请输入学生%d的%d科成绩:", i + 1, subiects);//i+1为学生序号
for (j = 0; j < subiects; j++)

scanf("%d", &a[i][j]);//students=4,subiects=3,你觉得a[4][3]赋值是赋给谁?下面同样错误


//输出成绩
printf("\t\tC语言\t大英\t高数\t总分\t平均分\n");
for (i = 0; i < students; i++)

sum=0;//每次都要赋0,否则会把前面同学成绩加进去
printf("\t同学%d", i+1);
for (j = 0; j < subiects; j++)

sum += a[i][j];//错误
printf("\t%d", a[i][j]);//错误

ave = sum*1.0 / subiects;
printf("\t%d\t%.2f\n",sum,ave);

printf("\n\n");
//颠倒输出
sum = 0;
ave = 0;
printf("\t");
for (i = 0; i < students; i++)
printf("\t同学%d", i + 1);
printf("\t平均分\n");
for (j = 0; j < subiects; j++)

if (j == 0)
printf("\tC语言");
if (j == 1)
printf("\t大英");
if (j == 2)
printf("\t高数");

sum=0;//赋0
for (i = 0; i < students; i++)

sum += a[i][j];//错误
printf("\t%d", a[i][j]);//错误

ave = sum*1.0 / students;
printf("\t%.2f\n",ave);

return 0;
参考技术C

你好

没有乱码

就是逻辑上有些错误

如图:

参考技术D 字符串使用前请使用清空语句把垃圾内存清理成'\0',也就是0x00(0):
memset(str2, 0x00, sizeof(str2));
当然,也可以在声明的时候进行初始化:
char str2[20] = 0;
这句也能实现同样的效果。这是C语言习惯,务必养成!
'\0'是字符串结束符,每当解释器看到这'\0'才会认为字符串终止,而你的程序明显没有字符串结束符,所以连同垃圾内存一起读出来了。“烫烫。。”等就是垃圾内存。
不明白欢迎追问

C语言文件问题:为啥下面程序会有乱码输出?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
FILE *fp1;
char s[20],str[20];
char fileout[10]="as.dat",filein[10]="bs.dat";
if((fp1=fopen(fileout,"wb"))==NULL)

printf("打开输出文件出错!\n");
exit(0);

scanf("%s",s);
fputs(s,fp1);
if((fp1=fopen(fileout,"rb"))==NULL)

printf("打开输入文件错误!\n");
exit(0);


while(!feof(fp1))
fgets(str,20,fp1);
//str[strlen(s)+1]='\0';
printf("%s\n",str);
fclose(fp1);
return 0;

图片以上传,请各位专家帮我看看,拜托了!

如下定义:
struct apparatus_info //定义仪器设备信息结构体
char number[10]; //设备编号
char name[20]; //设备名称
double price; //设备单价
char inDate[20]; //购进的时间
char producter[20]; //生产厂家
int count; //购进的数量
char usability[INITIAL_SIZE]; //设备的可用性
;
问题有好几处,也有几种方法解决

1,
分配给records[numApps]的内存空间虽然是给它使用
但是它没有初始化,里面是有一堆乱七八糟的数据

之后你保存到records[numApps]里的数据
如果没有用完numApps空间
尾巴还是有一堆乱七八糟的数据

所以不干净

如果records[numApps]是字符串
搬进去住前先把房间打扫一下,用
memset(records,0,numApps);
就是让它的存储空间全部写0

但是你的records[numApps]是结构体数组
所以需要另外保证每组数据的每个成员都有写值

2,
你用的是gets(str);
输入的是字符串,回车结束
str是10,而records得成员有10,20,这就有隐患

3,
atof和atoi函数使用的时候要小心
对于atoi和atof,
有新的函数可以替代
atoi可以用strtol替代,
而atof可以用strtod等替代
strtol比atoi安全,
records[numApps].price=(float)atof(str);
改成
records[numApps].price=(double)atof(str);

4,
输入records[numApps]成员数据的时候不如用
scanf("%d%f%s",&......);
格式化输入安全

5,
fp=fopen("app_info.txt","w");
是以文本方式写入文件的
fwrite(&records[i],sizeof(AppInfo),1,fp);
验证app_info.txt是文本还是二进制
fwrite的第一个参数是字符串,是文本
fwrite的第一个参数是int或float,是二进制
你的参数是结构体,数据类型复杂,app_info.txt是二进制
具体情况要具体分析

还有fwrite输出结构体数组数据,一句话多痛快
但是你要阅读,或者用程序读出来的时候你会感觉登山一样难

所以用fprintf格式化输出安全
for(i=0;i<numApps;i++)

fprintf(fp,"=============================\n");
fprintf(fp,"%s\n",&records[i].number);
fprintf(fp,"%s\n",&records[i].name);
fprintf(fp,"%f\n",&records[i].price);
fprintf(fp,"%s\n",&records[i].inDate);
fprintf(fp,"%s\n",&records[i].producter);
fprintf(fp,"%d\n",&records[i].count);
fprintf(fp,"%s\n",&records[i].usability);


6,
真要用fwrite
建议如下
char outbuf[max_buf]; //max_buf=1000或更大,保证够用
char tempbuf[20];
memset(outbuf,0,max_buf);

for(i=0;i<numApps;i++)

sprintf(tempbuf,"%s\n",&records[i].number);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].name);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%f\n",records[i].price);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].inDate);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].producter);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%d\n",records[i].count);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].usability);
strcat(outbuf,tempbuf);


if(fwrite(outbuf,strlen(outbuf),1,fp)!=1)

printf("写入错误!\n");

看,还是要格式化输出tempbuf,outbuf过渡一下
让fwrite写的是字符串

7,
输出前可以用下面printf显示来看看
学会debug
for(i=0;i<numApps;i++)

printf("%s\n",&records[i].number);
printf("%s\n",&records[i].name);
printf("%f\n",records[i].price);
printf("%s\n",&records[i].inDate);
printf("%s\n",&records[i].producter);
printf("%d\n",records[i].count);
printf("%s\n",&records[i].usability);

参考技术A 真是大哥,我告诉你为什么
因为我也遇到过
你用fprintf和fscanf语句进行文件的读取和存储,绝对不会出现这种问题的!!!追问

你可以告诉我这是为什么吗?

追答

用我老师的话说就是
fputs和fgets是一种不完善的输入输出流
我们现在一般都采用fprint和fscanf进行文件的输入输出了

本回答被提问者采纳
参考技术B #include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()

FILE *fp1;
char s[20] = "\0",str[20] ="\0";
char fileout[10]="as.dat",filein[10]="bs.dat";
if((fp1=fopen(fileout,"wb"))==NULL)

printf("打开输出文件出错!\n");
exit(0);

scanf("%s",s);
fputs(s,fp1);
if((fp1=fopen(fileout,"rb"))==NULL)

printf("打开输入文件错误!\n");
exit(0);


while(!feof(fp1))
fgets(str,20,fp1);
//str[strlen(s)+1]='\0';
printf("%s\n",str);
fclose(fp1);
return 0;

在使用局部数组对象的时候 ,记得要初始化才能使用。 我编译了下,然后看了下.bat文件数据都对的。
参考技术C scanf("%s",s);
改为scanf("%s",&s);

以上是关于C语言,字符串输出是乱码的主要内容,如果未能解决你的问题,请参考以下文章

C语言,字符串输出是乱码

c语言输出字符串数组出现乱码

为啥C语言输出文件内容乱码

C语言,字符串输出是乱码是怎么回事?

c语言 输出char类型 乱码

c语言如果用字符串类型输出字符数组,字符数组最后一个是0,那么为啥会出现乱码