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

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

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

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

在计算平均分的时候,你的语句是ave = sum / students;ave = sum / subiects

这个是不对的,应改为,ave =10 sum / students,ave =10 sum / subiects原因在于 假设sum=7,students=3,则ave=7/3=2,而实际想要的结果为23333

#include<stdioh>

#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 = 10sum / 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 = 10sum / students;

printf("\t%2f\n",ave);

}

return 0;

}

这里涉及到一个字符在源代码(文本)中,编译好的二进制文件中,以及最后控制台输出编码形式的区别

首先,要明确一点:C(语言/程序)并不理解ANSI,UTF-8以及任何其他编码它只知道处理你给它的字符的二进制表示

在简体中文Windows下,默认的文本保存编码是ANSI(即GBK);Linux下根据系统locale设定,一般应该是(zh_CNUTF-8)(以下基于简体中文Windows)

1)对于源文件中保存的"中文"这个字符串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(默认ANSI编码得到)但编译器才不管是不是GBK神马的,它就管那串数字

区别,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc默认UTF-8)注意,用MinGW编译的源文件中有中文宽字符必须保存为UTF-8编码

2)然后,在二进制文件中的存储形式,对传统的字符串(char str[] = "中文";),编译器什么都不做,直接把那串数字(如"0xd6d0","0xcec4")搬过去塞进二进制文件

但对于宽字符串(wchar_t wstr[] = L"中文";),编译器会将其做转换,转换成Unicode编码格式(在Windows是UTF-16,而Linux下是UTF-32)如"中文"的16位Unicode是"0x4e2d"和"0x6587",然后把这串转换后的数字("0x4e2d","0x6587")塞进二进制文件中(这里VS和MinGW做的没有区别)

这里有点需要注意,编译器必须知道你的源文件保存的编码!如VS默认是ANSI编码,如果你用UTF-8保存c源文件去用VS打开看一定是乱码同理如果你用mingw编译ANSI编码保存的源文件,也会出错!(但可以修改编译选项解决,见文章末尾) 在本文这里这个原因其实很好理解,因为编译器需要知道,如果它要将一个保存在文件中的字符转成宽字符时,是从什么编码转到Unicode(可见上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)

字体设置问题WIN7系统设置方式如下:

一 仅查看适合您的语言设置的字体的步骤

在允许选择字体的程序中,Windows 可以根据输入语言设置隐藏字体。可以让 Windows 自动显示和隐藏字体,也可以选择在程序中查看计算机上安装的所有字体。有关输入语言设置的信息,请参阅添加或更改输入语言。

1单击打开“字体”。

2在左侧窗格中,单击“字体设置”。

3确保选中“根据语言设置隐藏字体”复选框。如果未选中,请将其选中,然后单击“确定”。

提示:若要在程序中查看所有安装的字体,请清除“根据语言设置隐藏字体”复选框,然后单击“确定”。

二 手动显示和隐藏字体的步骤

还可以使用“显示”和“隐藏”按钮逐个显示或隐藏字体。

1单击打开“字体”。

2选择字体,然后单击“显示”或“隐藏”。

三 还原默认字体设置的步骤

可以删除对显示设置进行的任何更改。

1单击打开“字体”。

2在左侧窗格中,单击“字体设置”。

3单击“还原默认字体设置”。注意这还会删除对显示设置进行的所有手动更改。

以上就是关于C语言,字符串输出是乱码全部的内容,包括:C语言,字符串输出是乱码、C语言控制台程序,中文输出变成乱码,怎么解决、WIN系统,某些特殊符号乱码,不是全部。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9834177.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存