注意字符数组和字符串数组,字符串数组下标要比元素多1,并且结尾有\0.
getchar函数不带任何参数,它从输入队列中返回下一个字符(将要输入),Putchar()打印它的参数。
字符串输入:
首先分配空间,然后用输入函数获取该字符串。
gets函数直到遇到换行符,丢弃换行符,然后处理剩余字符,并在字符末尾添加空字符使之成为字符串。
gets函数的问题:它无法检查数组的长度,容易导致缓冲区溢出,造成擦写程序数据并导致程序中止的问题。
fgets函数加入了第二个参数,限制字符的输入,专门设计用来处理文件的输入,假如你设置的参数是n,那么你能读入的字符是n-1(n-1的位置留给了‘\0’).第三个参数指明要读入的文件,一般是标准输入,stdin,该标识符定义在stdio.h文件中。
fgets函数在读到文件结尾或者读取错误时会返回NULL.
fgets函数把换行符放在字符串的末尾,因此输出函数最好使用fputs函数配对使用,fputs函数的第二个参数为stdout(标准输出)
puts函数会在字符串末尾添加换行符,而fputs不会这样做。
fgets函数存储换行符的好坏:好:通过检查换行符来检查是否读取了一整行 坏处:你可能并不需要这个换行符。如果读取的不是一整行,还需要处理剩余字符。因此需要s_gets的出现
如何处理?1.处理换行符,将数组换行符替换成空字符。2.处理剩余字符
空字符与空指针,两者都可以用数值0表示,但空字符是整数类型,占1字节;
空指针是指针类型,是个地址,通常占4字节。
gets_s函数:只从标准输入中读取输入,不需要第三个参数,读到换行符会丢弃,这点和gets函数一样。 如果读到最大字符数都没有读到换行符,会将数组首字符替换成‘\0’然后读取并丢弃剩余字符。
fgets()函数返回指向字符串缓冲区的指针(地址)(读入成功)。
若n<=0返回NULL,n=1时返回空串。
读入错误或遇到文件结尾(EOF),则返回NULL。
gets函数返回其参数(一般是char数组)也即str;
s_gets的缺点:遇到不合适的输入时毫无反应。丢弃字符时你难以发觉。优点:超出数组范围时能够处理剩余字符。
scanf函数返回整数,这个整数为scanf呈贡读取的项数,或者返回EOF.
在scanf中使用字段宽度。
字符串输出
puts函数:字符串的地址作为参数传给puts函数,显示字符串是会在结尾自动加上换行符。输出完地址上存的值后会接着输出缓冲区的值。
双引号扩出来的字符串常量被当做地址,数组名是地址,以及指针变量。
Puts在哪里停止?遇到空字符停止,必须确保有空字符。
fputs函数不会输出换行符。fputs是puts针对文件制定版本,第二个参数指明要写入数据文件。
printf函数不会自动在每个字符串末尾加上换行符,但printf函数能格式化不同数据类型。
自定义输入\输出函数
比如不想要Puts函数的自动添加\n的功能,可以自己写一个利用putchar函数。
字符串函数
c库提供多个处理字符串的函数,这些函数的原型在string.h头文件中。
strlen()函数用于统计字符串长度。不包括‘\0’常见需要计算'\0'的情况是,以字符数组初始化一个字符串的时候,分配内存空间的情况。
char str[]="123456";
这时候数组str的大小需要计算'\0',也就是str有7个元素。
strcat()接受两个字符串作为参数,把第二个字符串备份附加在第一个字符串的末尾并变成新的第一个字符串,但是不会输出,要用输出函数输出。缺点:无法检查第一个字符串数组是否有足够空间容纳第二个数组。
strncat有第三个参数,为最大添加字符数,加到那个字符数或遇到空字符停止。
strcmp用于比较字符串的内容不是地址,返回值:不同字符串的比较返回值不同,如果字符串的排序(ASCII码)比第二个前面则返回负值,相等返回0,后面返回正值。
strncmp可以比较字符串不同地方,也可以比较第三个参数指定的字符数。可以限定函数只查找某几个字符。
strcpy和strncpy:第一个参数为目标字符串,第二个参数源字符串,声明数组会分配存储空间,声明指针只会分配一个存储地址的空间。
strcpy的其他属性:1.返回类型是char*.返回第一个参数的值即一个字符的地址。2.第一个参数不必指向数组的开始。strncpy第三个参数设置可拷贝的最大字符数。如果目标空间装不下副本则把副本最后一个元素设置为空字符。
sprintf定义在stdio.h文件中,和printf不同的是sprintf是把数据写入字符串中,第一个参数是字符串的地址,其余参数与Printf相同一个是格式字符串一个是待写入项的列表。
sprintf函数获取输入,并将其格式化为标准形式,然后把格式化的字符串存储在数组之中。
其他字符串函数(ASCI C库)
前面的函数常用形式。
char *strchr(const char *s,int c)如果s包含c字符,函数返回指向s字符串中首次出现的c字符的指针(末尾空字符也在查找范围之内),未找到指针则返回空指针。
char *strpbrk(const char *s1,const char*s2);如果s1包含s2字符串的任意字符,函数返回s1字符串首位置的指针;未找到则返回空字符;
char*strrchr(const char *s,char c)函数返回字符串中c最后出现的位置,未找到返回空字符。
char *strrstr(const char*s1,const char *s2)该函数返回s1字符串中s2字符串出现的首位置,未找到返回空字符。
size_t strlen(const char*s)返回s字符串的字符数不包括末尾的空字符。size_t是sizeof返回的类型
字符串示例:字符串排序
定义一个指针数组,数组里面是指针变量,让指针指向字符串,排序指针。用选择 排序算法排序指针。
命令行:在命令行环境中,用户为运行程序输入命令的行。命令行参数是同一行的附加项。
带参数的main函数:不带参数或者多个
关键概念:字符串以空字符结尾,应该使用strcmp代替关系运算符,用strcpy代替赋值运算把字符串赋给字符数组