.注重:你应该去了解一下"string-n”函数,虽然它们使用起来有些困难,但用它们编写的程序兼容性更好,错误更少。 假如你愿意的话,可以用函数strcpy()和strcat()重新编写例12.5a中的程序,并用很长的足以溢出缓冲区的参数运行它。会出现什么现象呢?计算机会挂起吗?你会得到"GeneralPRotection Exception”或内存信息转储这样的消息吗?请参见7.24中的讨论。 例12.5a使用"string—n”函数的一个例子 # include <stdio. h> # include <string. h> /* Normally, a constant like MAXBUF would be very large, to help ensure that the buffer doesn't overflow. Here, it's very small, to show how the "string-n" functions prevent it from ever overflowing. */ # define MAXBUF 16 int main (int argc, char* * argv) { char buf[MAXBUF]; int i; buf[MAXBUF - 1] = '/0'; strncpy(buf, argv[0], MAXBUF-1); for (i = 1; i<argc; ++i) { strncat(buf, " " , MAXBUF -1 - strlen (buf) ) ; strncat(buf, argv[i], MAXBUF -1 - strlen (buf ) ) ; } puts (buf ); return 0; }
注重:许多字符串函数都至少有两个参数,在描述它们时,与其称之为“第一个参数”和“第二个参数”,还不如称之为“左参数”和“右参数”。 函数strcpy()和strncpy()用来把字符串从一个数组拷贝到另一个数组,即把右参数的值拷贝到左参数中,这与赋值语句的顺序是一样的。 函数strcat()和strncat()用来把一个字符串连接到另一个字符串的末尾。例如,假如数组a1的内容为“dog”,数组a2的内容为“wood”,那么在调用strcat(al,a2)后,a1将变为“dogwood”。 函数strcmp()和strncmp()用来比较两个字符串。当左参数小于、等于或大于右参数时,它们都分别返回一个小于、等于或大于零的值。常见的比较两个字符串是否相等的写法有以下两种: if (strcmp(sl, s2)) { / * si !=s2 * / } 和 if (! strcmp(s1, s2)) { /* s1 ==s2 * / } 上述代码可能并不易读,但它们是完全有效并且相当常见的c代码,你应该记住它们。假如在比较字符串时还需要考虑当前局部环境(locale,见12.8),则要使用strcoll()函数。 有一些函数用来在字符串中进行检索(在任何情况下,都是在左参数或第一个参数中进行检索)。函数strchr()和strrchr()分别用来查找某个字符在一个字符串中第一次和最后一次出现的位置(假如函数strchr()和strrchr()有带“n”字母的版本,那么函数memchr()和memrchr()是最接近这种版本的函数)。函数strspn()、strcspn()(“c”表示"complement")和strpbrk()用来查找包含指定字符或被指定字符隔开的子字符串: n = strspn("Iowa" , "AEIOUaeiou"); / * n = 2( "Iowa" starts with 2 vowels * / n=strcspn("Hello world" ,"/t" ) ; / * n = 5; white space after 5 characters * / p = strbrk("Hellb world" ,"/t" ) ; / * p points to blank * /
函数strstr()用来在一个字符串中查找另一个字符串: p = strstr("Hello world", "or"); / * p points to the second "or" * /
函数strtok()按照第二个参数中指定的字符把一个字符串分解为若干部分。函数strtok()具有“破坏性”,它会在原字符串中插入NUL字符(假如原字符串还要做其它的改变,应该拷贝原字符串,并将这份拷贝传递给函数strtok())。函数strtok()是不能“重新进入”的,你不能在一个信号处理函数中调用strtok()函数,因为在下一次调用strtok()函数时它总是会“记住”上一次被调用时的某些参数。strtok()函数是一个古怪的函数,但它在分解以逗号或空白符分界的数据时是非常有用的。例12.5b给出了一个程序,该程序用strtok()函数把一个句子中的单词分解出来: 例12.5b一个使用strtok()的例子 # include <stdio. h> # include <string. h> static char buf[] = "Now is the time for all good men . . . " ; int main() { char * p; p = strtok(buf, " ") ; while (p ) { printf("%s/n" ,p); p = strtok(NULL, " "); } return 0; }