1.char还是uchar(unsigned char)
char在C/C++中占用1byte(即8bits)。
ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。标准ASCII码是7位二进制表示,表示128个字符(0~127),最高位是0。如 00110000(2) =48D=30H='0'。
由于char能表示的范围是(-128~127),英文中使用了0~127号编码的字符(符号位为0,正数)。一个汉字占2byte,为了使得汉字的两个字节不与英文字母混淆,表示汉字的每个字节符号位都为1(负数)。
在处理文本时,最好使用unsigned char(0~256),因为文本中可能会有含有特殊字符(不一定是标准ASCII),也就是读入的每个字符的ASCII码可能不在0~127之间。
下面的程序输出字符的ASCII码:
1 #include <iostream> 2 using namespace std; 3 int main () 4 { 5 string str ("hi你好"); ///6个字节,每个中文占2个字节 6 cout<<"Text:"<<str<<endl; 7 for(int i=0;i<str.size();i++) 8 printf("i=%d c_c=%c c_d=%d\n",i,str[i],(unsigned char)str[i]); 9 return 0; 10 }
2.换行符号
win和linux下面的换行符号不同。win下面的换行符是“\r\n”,linux下面的换行符是“\r”。
使用下面的程序读取文件中的每一行并显示长度:
1 #include <fstream> 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 int main(int argc,char* argv[]){ 7 fstream fin(argv[1]); ///参数为文件名 8 string readline; 9 while(getline(fin,readline)){ ///逐行读取,直到结束 10 cout<<readline<<"\t"<<readline.size()<<endl; 11 } 12 fin.close(); 13 return 0; 14 }
(1)win下面建立文件a_win.txt,在linux下面打开正常
分别在win、linux下执行结果如下,可以看出长度差1(就是最后的“\r”):
(2)linux下面建立文件a_unix.txt,在win下面打开没有换行
分别在win、linux下执行结果如下,可以看出长度相同:
可见,win和linux程序都可以识别'\n'为换行符。win下会多一个字符‘\r’。