| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 708 人关注过本帖
标题:问一个关于输出字符的问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
8樓的資料是MSDN信息,其中Note部分的文字說:%C是微軟VC++的printf()函數的擴展,當你使用printf_s("%C")時,它解釋後面的數據是寬字符(即Unicode字符),要用L前綴的,比如L'好'或L'A',用"%c"是原始的ANSI編碼字符;而當你用wprintf_s()函數的時候,用"%C"是輸出ANSI字符,%c則是寬字符。

也就是說,格式符的意義由printf()或wprintf()函數名稱決定:printf()是ANSI版本的輸出函數,則"%c"用原始意義,"%C"用於非ANSI的字符;wprintf()是寬字符版本的函數,則"%c"的原始意義是這個版本所對應的Unicode寬字符,"%C"則的另一版本即ANSI的字符。

Note,已經標明這是微軟擴展!這就是我前面叫你看幫助的原因,不同的編譯器有不同的解釋,衹能以當前編譯器自己的解釋爲準,不是《標準》沒有的東西,具體實現就不能有。


[ 本帖最后由 TonyDeng 于 2015-3-16 13:59 编辑 ]

授人以渔,不授人以鱼。
2015-03-16 13:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
先給你貼個圖:
图片附件: 游客没有浏览图片的权限,请 登录注册


授人以渔,不授人以鱼。
2015-03-16 22:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
12樓的擴展字符碼表,下面是控制碼表:
图片附件: 游客没有浏览图片的权限,请 登录注册


注意我的用詞:前者是字符碼表,後者是碼表。

授人以渔,不授人以鱼。
2015-03-16 22:06
lxmaint
Rank: 2
等 级:论坛游民
威 望:1
帖 子:20
专家分:74
注 册:2015-3-15
收藏
得分:4 
以下是引用TonyDeng在2015-3-16 03:16:19的发言:
顶一个,版主很专业,呵呵
2015-03-16 23:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
ASCII碼在128以上,屬於所謂的擴展字符,在純英文環境中,可以打印輸出12樓圖中列出的那些圖形字符。樓主代碼的目的,就是想輸出219那個細長方塊,2個細長塊合併成一個正方形的象棋格子。但這種擴展字符,顧名思義,它的解釋是因環境而異的。對ANSI字符編碼方案,每個字符的寬度均衹有8位,頂多表示256個不同的字符,刨去前面31個控制碼,以及中間傳統的可打印字符,128以上的擴展區,就被用作其他語言的字符。對中文而言,ANSI方案是以2個8位編碼合成爲一個漢字編碼,這2個8位符的編碼都在128以上,這樣程序發現這種編碼,就認爲應該解釋爲16位的字符編碼,它一次取連續的兩個字節作爲編碼,去字符檢索表中檢索字符圖形,輸出,那就是漢字編碼——同一個編碼,可以因使用不同的字庫而呈現不同的字體,比如宋體或楷體,編碼都是一樣的,但取出的圖案不同而已。對漢字系統,它是這樣解釋編碼,對其他語言的系統,也有它的一套解釋,所以在不同的系統上,同一個編碼輸出的字符可以是不一樣的。這就是問題的本質。

樓主的代碼,是30年前用純英文系統寫的代碼,利用了擴展字符圖案,但在現在的中文操作系統下,它已經把128以上的數據解釋爲漢字了,於是它一連氣取出2個字符(219,219),輸出一個漢字,而不是預想的那種圖案。

授人以渔,不授人以鱼。
2015-03-17 00:04
那个ID
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2015-3-13
收藏
得分:0 
/*本程序错误*/

# include <stdio.h>
# include <malloc.h>

void Quicksort(int * a, int low, int high);
int FindPos(int * a, int loe, int high);

int main()
{
    int i;
    int len;
    int *a;

    printf("输入需要排序的个数:");
    scanf("%d",&len);
    a = (int *)malloc(sizeof(int)*len);
     for (i = 0; i < len; i++)
     {
       scanf("%d",&a[i]);
     }
    Quicksort(a , 0, len-1);/* 0 表示第一个元素的下标, len-1 表示最后一个元素的下标*/

    for (i = 0; i < len; i++)
        printf("%d ", a[i]);
    puts("\n");


    return 0;
}

void Quicksort(int * a, int low, int high)
{
    int pos;
    if (low < high)
    {
        pos = FindPos(a, low, high);
        Quicksort(a, low, pos-1);
        Quicksort(a, pos+1, high);
    }
}

int FindPos(int * a, int low, int high)
{
    int val = a[low];

    while (low < high)
    {
        while (low < high && a[high] >= val)
            --high;
        a[low] = a[high];

        while (low < high && a[high] <= val)
          low++;
        a[high] = a[low];
    }/*终止 while 循环之后, low 和 high 是相等的*/

    a[low] = val;
    return high; /* high 可以改成 low, 但不能改成 val, a[low], a[high]*/


求大神看看
2015-05-17 22:00
快速回复:问一个关于输出字符的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018096 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved