找最长单词2.0(通过函数输出两个返回值,分别是单词的起始位置和长度,并且输出单词)
和之前不同的就是这里不是void函数,而是将数组作为返回值的一个int型函数,通过指针来把单词的起始位置和长度以数组的形式送达至主函数。
1 #include <stdio.h> 2 #include <string.h> 3 int *findword(char word[]); 4 int main() 5 { 6 char a[100]; 7 gets(a); 8 int k,m; 9 int *s;//定义指针来接受返回值的地址 10 s=findword(a); 11 printf("单词的起始位置为%d\n",s[1]+1); 12 printf("单词的长度为%d\n",s[0]); 13 printf("最长单词为"); 14 for(k=s[1];k<s[1]+s[0];k++){ 15 printf("%c",a[k]); 16 } 17 } 18 int *findword(char word[]){//这里部分和之前的内容几乎一样,唯一的不同就是函数的返回值为一个数组。 19 int n,i,a,b,c; 20 a=b=c=0; 21 n=strlen(word); 22 for(i=0;i<n;i++){ 23 if(word[i]!=' '){ 24 b++; 25 if(a<=b){ 26 a=b;//a为长度 27 c=i-a+1;//c为起始位置 28 } 29 continue; 30 } 31 else b=0; 32 } 33 static int str[2];//设置全局变量,防止在释放函数空间的时候导致str的地址被消除 34 int *d;//定义指针来指向全局变量,通过放回值将str的地址送至主函数 35 d=str; 36 str[0]=a;//a为单词长度 37 str[1]=c;//c为单词的起始位置 38 return d; 39 }
很重要的一点,一定要注意33行的那个static来设置全局变量,否则在函数运行完毕之后,函数的空间将会被释放,那么在函数中定义的str数组的地址也将被消除,致使主函数中的输出发生变化。因此需要设置全局变量来强制锁定str这个数组的地址。
如果不是题目的要求,感觉可以完全用void函数,再不然可以在主函数中输入来接受str的地址(其实这个全局变量就是这样的要求,无非就是位置在函数中罢了)。
人生如逆旅,我亦是行人