//string.c 字符串函数 ?1.strlen()函数-统计字符串长度; ? 返回值为 unsigned int; ? char *string; ? strlen(string);
?2.strcat()函数-拼接两个字符串,类型char *; ? char *strcat(char *restrict s1,const char *restrict s2); ? 该函数把s2指向的字符串拷贝至s1指向的字符串末尾。s2字符串 ? 的第一个字符将覆盖s1字符串末尾的空字符,该函数返回s1。 ? char flower[10] = "Rose"; ? char addon[] = "s smell like old shose." ? strcat(flower,addon); ? 缺点:无法检查第一个数组能否容纳第二个数组;
?3.strncat()函数-strcat()升级版; ? char *strncat(char *restrict s1,const char *restrict s2,size_t n); ? 该函数把s2指向的字符串的n个字符拷贝至s1指向的字符串末尾。s2字符串 ? 的第一个字符将覆盖s1字符串末尾的空字符,不会拷贝s2字符串中空字符和 ? 后面的字符,并在拷贝字符的末尾添加一个空字符,该函数返回s1。 ? char flower[10] = "Rose"; ? char addon[] = "s smell like old shose." ? int size = 13; ? strncat(flower,addon,size);//size指定了最大添加参数; ? 在加入第13个字符或遇到'\0'时停止;
?4.strcmp()函数-俩字符串作比较; ? int strcmp(const char *s1,const char *2); ? 若俩字符串参数相同,函数返回0, ? 否则返回非零值;若比较的字符串不同: ? strcmp("A","A") is 0 ? strcmp("A","B") is -1 ? strcmp("B","A") is 1 ? strcmp("Z","a") is -1 ? strcmp("apples","apple") is 1 ? 在字母表第一个字符串位于第二个字符串前面,返回负数; ? 反之,返回正数:(根据ASCII比较) ? #define answer "Grant" ? char try[size] = "Grant"; ? strcmp(answer,try);
?5.strncmp()函数-可以比较第三个参数指定的字符数; ? int strncmp(const char *s1,const char *s2,size_t n); ? 在比较n个字符后或者遇到'\0'停止比较。 ? const char *list = {"astronomy"}; ? strncmp(list,"astro",5)//只比较前五个字符;
?6.strcpy()函数-拷贝字符串(包括空字符); ? char *strcpy(char *restrict s1,const char *restrict s2); ? 返回类型为char *,第一个字符的地址s1; ? char target[20]; ? strcpy(target,"Hi ho!"); ? 缺点:不能检查目标空间是否容纳源字符串的副本;
?7.strncpy()函数-更谨慎的选择; ? char *strncpy(char *restrict s1,const char *restrict s2,size_t n); ? 返回类型为char *,第一个字符的地址s1;第三个参数指明可拷贝的最大字符数; ? 该函数不会拷贝空字符后面的字符,若源字符串的字符少于n个,目标字符串就 ? 以拷贝的空字符结尾。若源字符串>=n个,不拷贝空字符。 ? char target[20]; ? strcpy(target,"Hi ho!",2);
?8.strpbrk()函数 ? char *strpbrk(const char *s1,const char *s2); ? 若s1字符中包含s2字符串中的任意字符,该函数返 ? 回指向s1字符串首地址的指针;若在s1中为找到s2 ? 中的字符,则返回空字符。
?9.strrchr()函数 ? char *strrchr(const char *s,int c); ? 该函数返回s字符串中c字符的最后一次出现的位置 ? (末尾的空字符也是字符串的一部分,所以在查找 ? 范围内)。若没找到c字符返回空指针。
?10.size_t strlen()函数 ? size_t strlen(const char *s); ? 该函数返回s字符串中的字符数,不包括末尾的空字符。
?11.strstr()函数 ? char *strstr(const char *s1,const char *s2); ? 该函数返回指向s1字符串中s2字符串出现的首位置。 ? 如果在s1中没有找到s2,返回空指针。
//字符串输入输出 ?1.gets()函数-读取整行输入,直到遇到换行符; ? char *gets(char *str); ? 然后丢弃换行符,储存其与字符,并在末尾+'\0'; ? 若读到文件结尾会返回空指针 ? 缺点:无法检查数组是否能装得下输入行。 ? eg:读取一行输入,打印一行该输入。 ? char line[81]; ? while (gets(line)) //与while (gets(line) != NULL)相同 ??? ?put(gets);
?2.缓冲区溢出:多于的字符超出了指定的目标空间。 ? 若这些多于字符只是占用了尚未使用的内存,就不会立即 ? 出现问题,若它们擦写掉程序中其他数据,会导致程序异常中止。
?3.puts()函数-显示字符串,并在末尾添加换行符; ? int puts(const char *str); ? 执行成功返回非负数,执行失败返回EOF;
?4.fgets()函数-显示字符串, ? char *fegets(char *str,int n,FILE *stream); ? 从指定的流stream读取一行,存储在str所指向的 ? 字符串内,当读取(n-1)个字符,或'\n'亦或到达 ? 文件末尾停止。 ? 返回地址与传入的第一个参数相同,但若读到文件 ? 末尾或读取错误,返回空指针。
?5.fputs()函数-向指定文件写入一个字符串; ? 不自动写入字符串结束标记'\0',成功写入一个字符串后, ? 文件的位置指针自动后移,函数返回值为非负整数;否则返回EOF。 ? fputs()会保留输入中的换行符。 ? int fuputs(char *string,FILE *stream); ? eg:读取一行输入,打印一行该输入。 ? char line[81]; ? while (fgets(line,81,stdin)) ??? ?fputs(line,stdout); ? ?6.空字符与空指针 ????? 空字符('\0'):标记c字符串末尾的字符,对应字符 ? 编码是0;由于其他字符的编码不可能是0,所以不可能 ? 是字符串的一部分。 ????? 空指针(NULL)有一个值,该值不会与任何数据的有效 ? 对应。通常,函数使用它返回一个有效地址表示某些特殊 ? 情况发生,例如遇到文件末尾或者未能按期执行。 ????? 空字符是整数类型,占1字节;空指针是一个地址,通 ? 常占4字节。
?7.gets_s()函数 ? char *gets_s(char *str,int n); ? gets_s()只从标准输入中读取数据; ? gets_s()读到换行符,会丢弃它不储存它; ? gets_s()读到最大字符数都没有读到换行符,会执行 ? 以下几步。首先把目标数组中是首字符设置为空字符, ? 读取并丢弃随后的输入直到读到换行符或文件末尾, ? 然后返回空指针。接着,调用依赖实现的“处理函数”, ? 可能会中止或退出程序。
?8.scanf()函数 ? int scanf(const char *restrict format,...); ? scanf()返回成功读入的数据项数,读入数据时 ? 遇到“文件结束”则返回EOF。
?9.printf()函数 ? int printf(char *format...); ? printf()返回值为实际控制输出的字符数。 //其他 sizeof()函数;
|