free(p+5) 答:最后两个语句是错误的。 ANSIC不允许free函数释放一块非动态分配的内存,也 不允许它释放一次动态分配的内存的一部分。而这两个语句分别犯了其中的一个错误。尽管 一些系统(如TC2.0)并不捕获这个错误,似乎已经释放了空间,但事实上并没有释放。这 种隐藏错误的行为是最糟糕的。 7.19设有两个串S1和S2,编程:如果串S2包含在串S1中(不含S2的串结束符),则 输出S2的第一个字符出现在串S1中的位置;否则如果没有该串出现则输出“S2不在S1中 如果S2是一个空串(长度为0的串),则输出“S2为空”。(此题即库函数 strstr0) 算法分析:子串的定位操作是各种字符串处理系统中最重要的操作之一。这里给出一种 最简单的(但不是最好的)求子串的算法,其基本思想是:在串S1中取从第i(i的初值为 S1的首字符位置)个字符起、长度和串S2相等的子串,将其与串S2比较,若相等,则 即为所求;否则i增1如此继续比较,直至串S1中不存在和串S相等的字串为止。下面是 该算法思想的一个实现方案。 #include <stdio. h> int maino char s1[81],S2[81]={"0"}; int Sllen, Salen, i,j: printf(" Input string S1 if(*S2=='\0) printf( The string S2 is NULL. \n") else i=0;j=0; while(i< Silen &&j< S2len if(slli]==S2[j]) printf(" the S2 first character appears in SI4 free(p+5); 答:最后两个语句是错误的。ANSIC 不允许 free 函数释放一块非动态分配的内存,也 不允许它释放一次动态分配的内存的一部分。而这两个语句分别犯了其中的一个错误。尽管 一些系统(如 TC2.0)并不捕获这个错误,似乎已经释放了空间,但事实上并没有释放。这 种隐藏错误的行为是最糟糕的。 7.19 设有两个串 S1 和 S2,编程:如果串 S2 包含在串 S1 中(不含 S2 的串结束符),则 输出 S2 的第一个字符出现在串 S1 中的位置;否则如果没有该串出现则输出“S2 不在 S1 中”。 如果 S2 是一个空串(长度为 0 的串),则输出“S2 为空”。(此题即库函数 strstr()) 算法分析:子串的定位操作是各种字符串处理系统中最重要的操作之一。这里给出一种 最简单的(但不是最好的)求子串的算法,其基本思想是:在串 S1 中取从第 i(i 的初值为 S1 的首字符位置)个字符起、长度和串 S2 相等的子串,将其与串 S2 比较,若相等,则 i 即为所求;否则 i 增 1 如此继续比较,直至串 S1 中不存在和串 S2 相等的字串为止。下面是 该算法思想的一个实现方案。 #include <stdio.h> #include <string.h> int main() { char S1[81],S2[81] = {"\0"}; int S1len,S2len,i,j; printf("Input string S1:"); scanf("%s",S1); printf("Input string S2: "); scanf("%s",S2); if(*S2 =='\0') printf("The string S2 is NULL.\n "); else { i = 0; j = 0; S1len = strlen(S1); S2len = strlen(S2); while(i < S1len && j < S2len) { if(S1[i]==S2[j]) { ++i; ++j; } else{ i = i-j+1; j = 0; } } if(j>=S2len) printf("The S2 first character appears in S1 the position is %d\n ",i-S2len);