回 帖 发 新 帖 刷新版面

主题:C语言输出大于等于号怎么办?

c语言中大于等于号的输出我是这样编程的,环境是visual c++6.0.程序如下:
#include<stdio.h>

int main(void)
{
   char ch;
   ch='\362';
   printf("%c\n",ch);
   return 0;
}
visual c++输出是个问号,记得c语言中字符型数据在ASCII码范围内和整数是相互通用的,那按理我的ch=242(就是八进制的\362)应该也是可以的才对,但两种方法显示都是问号,这是为什么呢?请教各位大神了。。。。

回复列表 (共4个回复)

沙发

codepage设置得不对
同样是242这个数值,在不同的编码中代表的字符是不一样的

板凳

简单代码:
#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "");
    printf("%lc\n", L'≥');
    return 0;
}

解释:
1、C语言的char一般是一个字节的,一个字节的值只有256种不同的可能性,因此最多只能表示256个字符。很多字符(例如汉字字符)无法用一个char来表示。于是C语言又提供了另一种字符类型的变量,这就是wchar_t。它与char类似,但使用更多的字节(一般是两个字节),从而,wchar_t可以表示更多不同的字符。
2、对于char,字符用单引号,字符串用双引号。这个相信楼主已经很熟悉了。对于wchar_t,也类似,但在前面加一个大写的L。比如程序里面的L'≥'。
3、对于函数。像strlen, strcpy这些函数,是对char类型的字符串使用的。如果要对wchar_t类型的字符串使用,则应该选择wcs开头的函数代替str开头的函数,比如wcslen,wcscpy这两个函数就分别相当于strlen和strcpy,只是它们作用于wchar_t的字符串。
4、printf函数中,%lc用于输出一个wchar_t,就像%c用于输出一个char,%ld用于输出一个long int一样。
5、locale。世界上的所有文字加起来,远远不止65536种(好像仅仅是汉字的数量就超过了这个数目),因此,即使使用两个字节表示一个字符,也还是不够的。虽然继续增加一个字符的字节数可以解决这个问题(例如:用四个字节表示一个字符),但那样显得有些浪费,并且可能产生其它问题。为此,C语言标准库提出了locale的概念。locale就是区域,不同区域会有不同的语言习惯。比如,362这个数字在A区域表示某个汉字,但在B区域却表示某个俄语字母。当我调用printf函数,输出一个值为362的wchar_t之时,程序会检查当前设置的区域。如果区域设置为A,则显示出一个汉字,如果区域设置为B,则显示出一个俄语字母。当然,语言习惯除了字符编码之外,还有很多内容。比如日期的格式、数字的格式、等等。
用setlocale设置区域。默认情况下,会有一个名字叫"C"的区域。这个区域的语言习惯就是C语言的默认语言习惯。如果区域设置为"",则实际上就是设置为操作系统默认的语言习惯(对于中文操作系统,一般就默认为中文了,所以我前面那段代码可以正确输出)。

3 楼

[quote]简单代码:
#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "");
    printf("%lc\n", L'≥');
    return 0;
}

解释:
1、C语言的char一般是一个字节的,一个字节的值只有256种不同的可能性,因此最多只能表示256个字符。很多字符(例如汉字字符)无法用一个char来表示。于是C语言又提供了另一种字符类型的变量,这就是wchar_t。它与char类似,但使用更多的字节(一般是两个字节),从而,wchar_t可以表示更多不同的字符。
2、对于char,字符用单引号,字符串用双引号。这个相信楼主已经很熟悉了。对于wchar_t,也类似,但在前面加一个大写的L。比如程序里面的L'≥'。
3、对于函数。像strlen, strcpy这些函数,是对char类型的字符串使用的。如果要对wchar_t类型的字符串使用,则应该选择wcs开头的函数代替str开头的函数,比如wcslen,wcscpy这两个函数就分别相当于strlen和strcpy,只是它们作用于wchar_t的字符串。
4、printf函数中,%lc用于输出一个wchar_t,就像%c用于输出一个char,%ld用于输出一个long int一样。
5、locale。世界上的所有文字加起来,远远不止65536种(好像仅仅是汉字的数量就超过了这个数目),因此,即使使用两个字节表示一个字符,也还是不够的。虽然继续增加一个字符的字节数可以解决这个问题(例如:用四个字节表示一个字符),但那样显得有些浪费,并且可能产生其它问题。为此,C语言标准库提出了locale的概念。locale就是区域,不同区域会有不同的语言习惯。比如,362这个数字在A区域表示某个汉字,但在B区域却表示某个俄语字母。当我调用printf函数,输出一个值为362的wchar_t之时,程序会检查当前设置的区域。如果区域设置为A,则显示出一个汉字,如果区域设置为B,则显示出一个俄语字母。当然,语言习惯除了字符编码之外,还有很多内容。比如日期的格式、数字的格式、等等。
用setlocale设置区域。默认情况下,会有一个名字叫"C"的区域。这个区域的语言习惯就是C语言的默认语言习惯。如果区域设置为"",则实际上就是设置为操作系统默认的语言习惯(对于中文操作系统,一般就默认为中文了,所以我前面那段代码可以正确输出)。[/quote]
十分感谢您的细致而又详细的分析,我现在学得还不是太深入,能有幸接触到更进一步的知识,受益匪浅,理解中。。。

4 楼

嗯,setlocale在不同編譯器帶的庫中支持范圍也不一樣,老版本的C++Builder只支持C Area。

我来回复

您尚未登录,请登录后再回复。点此登录或注册