第11章 字符串和字符串函数
11.1 表示字符串和字符串I/O
11.1.1 在程序中定义字符串
1.字符串字面量
双引号括起来的内容 为字符串字面量 或称为字符串常量。
字符串常量属于静态(static)存储类别,如果在函数中使用字符串常量,在字符串只会被存储一次,在整个程序生命期内存在。
2.字符串数组和初始化
定义字符串数组:
const char m1[40] = "Limit youtself to one line's worth.";
可以省略数组大小,让编译器自动计算数组大小:
const char m2[] = "Limit youtself to one line's worth.";
使用指针表示法创建字符串:
const char* pt1 = "Something is pointing at me.";
3.数组和指针
初始化数组把静态存储区的字符串拷贝到数组中,初始化指针只把字符串的地址拷贝给指针。
4.数组和指针的区别
11.1.2 指针和字符串
const char * msg = "Don't be a fool!";
const char * copy;
copy = msg;
这里的复制是让copy指向msg指向的地址,而不是将字符串拷贝过来。
11.2 字符串输入
读入字符串:1.分配空间,2.用输入函数获取该字符串(存到之前分配的空间)。
11.2.1 分配空间
char * name;
scanf("%s", name);
在读入name时,name未初始化,所以会把数据存到不确定的地方。所以,不要写这种东西。
可以使用数组分配空间:
char name[81];
之后可以用读取字符串函数 (如scanf) 读字符串到name中。
11.2.2 gets()函数 //由于可能导致缓冲区溢出,产生安全问题。在C11标准中已经被废除
gets() 读取整行输入,直到遇到换行符,然后丢弃换行符。
puts() 用于显示字符串,并在末尾添加换行符。
#include<stdio.h> #define STLEN 81 int main(void) { char words[STLEN]; puts("Enter a string,Please."); gets(words); printf("Yout string twice:\n"); printf("%s\n",words); puts(words); puts("Done."); return 0; }
11.2.3 gets()的替代品
1.fgets()函数
fgets()函数通过第2个参数(例如n)限制读入的字符数来解决溢出问题。
fgets()将读取n-1个字符或遇到第一个换行符为止。fgets()读到的换行会存在字符串中。
fgets()第3个函数指明要读入的文件。如果用stdin 可表示从键盘输入
通常与fputs()配对使用。fputs()第二个参数表示要写入的文件,如果是stdout,就是输出在显示器上。
2. gets_s() 函数
用第二个参数限制读入的字符数。
11.2.4 scanf()函数
11.3 字符串输出
put(字符串地址)
fput(字符串地址,文件)
printf() //可以格式化输出
11.4 自定义输入/输出函数
可以利用getchar()和putchar()自定义函数来处理字符串。
11.5 字符串函数 string.h
strlen() //获取字符串长度
strcat() //拼接字符串
strncat()//拼接n长度的字符串
strcmp()//比较字符串
strcpy()
strncpy() //复制字符串本身
11.6 字符串示例
11.7 ctype.h 字符函数 用于处理字符
11.8 命令行参数
使用命令行运行程序时可以在同一行添加参数
程序通过main()的参数读取这些参数,
11.9 把字符串转换成数字
atoi()