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; }
运行结果如下:
答案就是一个有换行,一个没有换行。
读取字符串也有两个方法:scanf和gets函数。
我们来说下他们的区别:
scanf会忽略掉之前所有的空白字符,然后读取所有字符,直到遇到空白字符位置。总之,scanf不会包含任何空白字符,包括空格,制表符等等。
gets不会忽略空白字符,读取所有字符,直到遇到换行符为止。
举个例子吧:
int main() { char str1[100]; scanf("%s",str1); printf("printf的?结á果?:%s",str1); }int main() { char str2[100]; gets(str2); printf("gets的?结á果?:%s",str2); return 0; }