运行c程序 终端出现乱码

为当前最终发行版之前的所有版本提供支持
回复
gl4215269
帖子: 29
注册时间: 2010-02-17 22:45
送出感谢: 0
接收感谢: 0

运行c程序 终端出现乱码

#1

帖子 gl4215269 » 2011-04-06 21:38

C的代码
#include<stdio.h>
#include <string.h>
#define A "┏"
#define B "┣"
#define C "┗"
#define D "┳"
#define E "╋"
#define F "┻"
#define G "┓"
#define H "┫"
#define M "┛"
#define N "○"
#define I "●"
void out(char (*p)[10][3])
{
int i=0,j=0;
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
printf("%s",*(*(p+i)+j));
}
printf("\n");
}
}
int main()
{
int a,b;
int i,j;
char arr[10][10][3];
char (*p)[10][3];
p=arr;
strcpy(arr[0][0],A);
strcpy(arr[0][9],G);
strcpy(arr[9][0],C);
strcpy(arr[9][9],M);
for(i=1;i<9;i++)
{
for (j=1;j<9;j++)
{
strcpy(arr[j],E);
}
}
i=0;
for(j=1;j<9;j++)
{
strcpy(arr[j],D);
}
i=9;
for(j=1;j<9;j++)
{
strcpy(arr[j],F);
}
for (i = 1; i < 9; i++)
{
strcpy(arr[0],B);
strcpy(arr[9],H);
}
out(p);
while(1)
{
printf("白子走,请输入行,列:");
scanf("%d,%d",&a,&b);
strcpy(arr[a-1][b-1],N);
out(p);
printf("黑子走,请输入行,列:");
scanf("%d,%d",&a,&b);
strcpy(arr[a-1][b-1],I);
out(p);
}
return 0;
}
终端运行

xl@xl-Compaq-Presario-CQ45-Notebook-PC:~$ gcc 18.c -o 18
xl@xl-Compaq-Presario-CQ45-Notebook-PC:~$ ./18
(�s��Ts����8s�����8s��������
���Ъܪ������
`�Ts��Ts��<��<xs��̄`�Hs���̄`�Ks��`�Ns���Qs��Ts���
�t���}.��}..��
�t�����s������┏┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳
┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┣
╋╋╋╋╋╋╋┫┣╋╋╋╋╋╋┫┣╋╋╋╋╋┫┣╋╋╋╋┫┣╋╋╋┫┣╋╋┫┣╋┫┣┫┣┣
╋╋╋╋╋╋╋┫┣╋╋╋╋╋╋┫┣╋╋╋╋╋┫┣╋╋╋╋┫┣╋╋╋┫┣╋╋┫┣╋┫┣┫┣┣
╋╋╋╋╋╋╋┫┣╋╋╋╋╋╋┫┣╋╋╋╋╋┫┣╋╋╋╋┫┣╋╋╋┫┣╋╋┫┣╋┫┣┫┣┣
╋╋╋╋╋╋╋┫┣╋╋╋╋╋╋┫┣╋╋╋╋╋┫┣╋╋╋╋┫┣╋╋╋┫┣╋╋┫┣╋┫┣┫┣┣
白子走,请输入行,列:
请问怎么解决。。
附件
Screenshot-1.png
头像
自由建客
论坛版主
帖子: 13444
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 运行c程序 终端出现乱码

#2

帖子 自由建客 » 2011-04-06 22:06

用宽字符吧!
gl4215269
帖子: 29
注册时间: 2010-02-17 22:45
送出感谢: 0
接收感谢: 0

Re: 运行c程序 终端出现乱码

#3

帖子 gl4215269 » 2011-04-06 22:12

自由建客 写了:用宽字符吧!
怎么搞之~...
头像
自由建客
论坛版主
帖子: 13444
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 运行c程序 终端出现乱码

#4

帖子 自由建客 » 2011-04-06 22:51

gl4215269 写了:
自由建客 写了:用宽字符吧!
怎么搞之~...
自己参考去

代码: 全选

#include <iostream>
#include <locale>
#include <cstdlib>

using namespace std;

class Line {
public:
    Line(double k=0.0, double b=0.0): K(k), B(b) { /* 空 */ }
    void SetK(double k) { K=k; }
    void SetB(double b) { B=b; }
    double GetK() { return K; }
    double GetB() { return B; }
    void Show()
    {
        wcout << L"斜率: " << K << endl
            << L"截距: " << B << endl
            << L"解析式: " << "y = " << K << "*x + " << B << endl;
    }
private:
    double K,B;
};

int main()
{
    const char *s=getenv("LC_ALL");
    if(s==NULL) {
        s=getenv("LANG");
        if(s==NULL) s="C";
    }
    setlocale(LC_ALL, s);

    Line l(3,5);
    l.Show();
    l.SetK(-0.5);
    l.SetB(3.9);
    l.Show();

    return 0;
}
头像
HelloAndroid
帖子: 156
注册时间: 2010-10-17 18:23
送出感谢: 0
接收感谢: 0

Re: 运行c程序 终端出现乱码

#5

帖子 HelloAndroid » 2011-04-06 22:52

-set encoding gb2312
用起来还是蛮舒服的!
生命在于折腾!
为什么这个论坛复旦的人很少!!
头像
goldfox_79
帖子: 1937
注册时间: 2005-10-16 8:26
来自: 地球
送出感谢: 0
接收感谢: 1 次
联系:

Re: 运行c程序 终端出现乱码

#6

帖子 goldfox_79 » 2011-04-06 23:11

gl4215269 写了:C的代码
。。。。。。
#define A "┏"
。。。。。。
int main()
{
。。。。。。
char arr[10][10][3];
。。。。。。
strcpy(arr[0][0],A);
。。。。。。
}
你的错误很简单:你定义的字符串A、B等,实际上是长度为3的字符串(你可以输出strlen(A)来检查),而在主函数里用来保存每个节点输出字符的字符串arr只有三个字节长,没有地方存储终止字符,输出的时候自然就是乱的。只要把“char arr[10][10][3]”改成“char arr[10][10][4]“就可以了。下面的截图是修改后的程序的输出效果。
附件
screenshot.png
上次由 goldfox_79 在 2011-04-06 23:17,总共编辑 1 次。
头像
goldfox_79
帖子: 1937
注册时间: 2005-10-16 8:26
来自: 地球
送出感谢: 0
接收感谢: 1 次
联系:

Re: 运行c程序 终端出现乱码

#7

帖子 goldfox_79 » 2011-04-06 23:13

我用的gnome-terminal 是utf-8编码。

mark,棋类 界面 输出
头像
自由建客
论坛版主
帖子: 13444
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 运行c程序 终端出现乱码

#8

帖子 自由建客 » 2011-04-06 23:24

还是用宽字符好,这样无论是在 UTF-8 终端还是 GBK 终端都能正常显示。
忘掉 printf ,改用 wprintf 等等。
这是个比较大的课题,自己 google 吧。

代码: 全选

aptitude install -R manpages-posix-dev
man wchar.h
回复

回到 “老旧版本支持”