1. 字符串入门

字符串也称字符串字面量,是用一对双引号括起来的字符序列。

我们也许经常会遇到字符串特别长的情况,在C#中,我们一般会用@符号来表示。

    Console.WriteLine(@"Hello
World");

但是在C中,我们会这样来写:

int main()
{
printf("Hello "
"world");
return 0;
}

还记得我曾经讲的最多的一句话就是,把字符串当做字符数组来玩。

其实在本质上,C语言就是把字符串作为字符数组来处理,当C语言编译器遇到长度为N的字符串时,它会为字符串字面量分配长度为N+1的内存空间。之所以为N+1,是因为在字符串的末尾以’\0’来结尾,来标识字符串的结束。

既然,我们说字符串在编译器中以字符数组来处理,那么编译器自然会将其看成char *类型的指针。也就是说,我们可以这样来写:

int main()
{
char *str="abc";
printf("%s",str);
}

2. 字符数组和字符指针

这样的两个声明:

char str1[]="abc";
char *str2="def";

前者是普通的字符数组,后者是字符指针。两者都可以用作字符串,但是他们是不一样的。

声明为数组时,就像其他常规的数组一样,可以随意修改数组中的元素,即字符串中的字符。但是用字符指针,我们是不能修改的。

另外,声明为数组时,我们知道我们不能将这个数组名赋给其他的数组,但是如果用指针,我们则可以将该指针指向其他的字符串。

用最简单的例子来说明:

char str1[]="abc";
char *str2="def";
*str2='q'; //Error
str1[0]='q';

前者是错误的,后者是正确的。

3. 声明字符数组的惯用法

看段代码就OK了

#define STR_LEN 10

int main()
{
char str[STR_LEN+1];
}

在宏定义处强调的是字符串的大小,而在声明字符数组的时候,将宏定义加1,因为要存储”\0”。

4. 字符串的输入输出

字符串的输出方式有两种,printf和puts,下面的例子足以说明他们的区别:

int main()
{
puts("Hello world");
printf("Hello world");
return 0;
}

运行结果如下:

C语言学习笔记(8)_编译器

答案就是一个有换行,一个没有换行。

读取字符串也有两个方法:scanf和gets函数。

我们来说下他们的区别:

scanf会忽略掉之前所有的空白字符,然后读取所有字符,直到遇到空白字符位置。总之,scanf不会包含任何空白字符,包括空格,制表符等等。

gets不会忽略空白字符,读取所有字符,直到遇到换行符为止。

举个例子吧:

int main()
{
char str1[100];
scanf("%s",str1);
printf("printf的?结á果?:%s",str1);
}

C语言学习笔记(8)_字符串_02

int main()
{
char str2[100];
gets(str2);
printf("gets的?结á果?:%s",str2);
return 0;
}

C语言学习笔记(8)_字符串_03