C语言处理英文字符

前面我们多次提到了字符串,字符串是多个字符的集合,它们由" "包围,例如"http://www.baidu.com""岳麓书院"字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存

当然,字符串也可以只包含一个字符,例如"A""6";不过为了操作方便,我们一般使用专门的字符类型来处理。

初学者经常用到的字符类型是 char它的长度是 1,只能容纳 ASCII 码表中的字符,也就是英文字符

要想处理汉语、日语、韩语等英文之外的字符就得使用其他的字符类型,char 是做不到的,我们将在下节《C语言处理中文字符》中详细讲解。

字符的表示

  • 字符类型由单引号' '包围
  • 字符串由双引号" "包围

下面的例子演示了如何给 char 类型的变量赋值:

//正确的写法
char a = '1';
char b = '$';
char c = 'X';
char d = ' '; // 空格也是一个字符
//错误的写法
char x = '中'; //char 类型不能包含 ASCII 编码之外的字符
char y = 'A'; //A 是一个全角字符
char z = "t"; //字符类型应该由单引号包围

说明:

  • 在字符集中,全角字符和半角字符对应的编号(或者说编码值)不同,是两个字符
  • ASCII 编码只定义了半角字符,没有定义全角字符

字符的输出

输出 char 类型的字符有两种方法,分别是:

  • 使用专门的字符输出函数 putchar
  • 使用通用的格式化输出函数 printf,char 对应的格式控制符是%c

请看下面的演示:

#include <stdio.h>
int main() {
char a = '1';
char b = '$';
char c = 'X';
char d = ' ';
//使用 putchar 输出
putchar(a); putchar(d);
putchar(b); putchar(d);
putchar(c); putchar('\n');
//使用 printf 输出
printf("%c %c %c\n", a, b, c);
return 0;
}

putchar 函数每次只能输出一个字符(个人:因为putchar每次只能输出一个字符,所以它就不可能再额外的自带输出一个换行符,而putchar本来就是输出字符函数,不是输出字符串的函数,所以putchar也不可能额外输出一个换行符,没有这个必要),输出多个字符需要调用多次

字符与整数

我们知道,计算机在存储字符时并不是真的要存储字符实体,而是存储该字符在字符集中的编号(也可以叫编码值)对于 char 类型来说,它实际上存储的就是字符的 ASCII 码无论在哪个字符集中,字符编号都是一个整数

从这个角度考虑,字符类型和整数类型本质上没有什么区别

  • 我们可以给字符类型赋值一个整数
  • 或者以整数的形式输出字符类型。(个人:也就是说char类型内存中存储的就是字符编号,就是一个整数,就看我们怎么解释这个内存里的内容,既可以解释成char,也可以解释成整数)
  • 反过来,也可以给整数类型赋值一个字符
  • 或者以字符的形式输出整数类型

请看下面的例子:

#include <stdio.h>
int main()
{
char a = 'E';
char b = 70;
int c = 71;
int d = 'H';
printf("a: %c, %d\n", a, a);
printf("b: %c, %d\n", b, b);
printf("c: %c, %d\n", c, c);
printf("d: %c, %d\n", d, d);
return 0;
}

在 ASCII 码表中,字符 'E'、'F'、'G'、'H' 对应的编号分别是 69、70、71、72。

a、b、c、d 实际上存储的都是整数

  • 当给 a、d 赋值一个字符时,字符会先转换成 ASCII 码再存储
  • 当给 b、c 赋值一个整数时,不需要任何转换,直接存储就可以
  • 以 %c 输出 a、b、c、d 时,会根据 ASCII 码表将整数转换成对应的字符
  • 以 %d 输出 a、b、c、d 时,不需要任何转换,直接输出就可以

可以说,是 ASCII 码表英文字符整数关联了起来

再谈字符串

前面我们讲到了字符串的概念,也讲到了字符串的输出,但是还没有讲如何用变量存储一个字符串。其实在C语言中没有专门的字符串类型,我们只能使用数组或者指针来间接地存储字符串。本节我不会讲解太多,大家只需要死记硬背下面的两种表示形式即可:

//我:这里web_url[]是一个字符数组,我们除了可以一个字符一个字符的初始化数组,对于字符
//数组,可以使用这样的便捷方式直接初始化
char web_url[] = "https://www.baidu.com";
const char* web_name = "hello world";

完整的字符串演示:

#include <cstdio>
int main()
{
    char web_url[] = "https://www.baidu.com";
    char* web_name = "hello world";
    puts(web_url);
    puts(web_name);
    printf("%s\n%s\n", web_url, web_name);
    return 0;
}

上面的代码,在Windows10 64+ clion+mingw64,能运行但是会报警告:

但是在vstudio2022中,直接报错,无法编译:

 按照提示修改后,运行结果如下:

#include <stdio.h>
int main()
{
	char web_url[] = "http://www.baidu.com";
	const char* web_name = "hello world";
	puts(web_url);
	puts(web_name);
	printf("%s\n%s\n", web_url, web_name);
	return 0;
}

 

posted on 2022-05-15 13:52  朴素贝叶斯  阅读(180)  评论(0编辑  收藏  举报

导航