首先,基本目标很简单,就是利用C语言:编写一个函数,输入一行字符,将此行字符中的最长的单词输出。
代码如下:
#include<stdio.h> void input(char s[]){ int i=0; for(int c;(c=getchar())!='\n';i++){ s[i]=c; } s[i]='\0';//读取完成,记得对这个字符数组封口 } char* findmax(char s[]){ int max=0,word_length=0,p=0,i=0;//这个p是用来记录最长单词的位置 for(i=0;s[i]!='\0';i++){ if(s[i]==' '){//扫到空格,则结算是否为最长的单词 if(max<word_length){ max=word_length; p=i; } word_length=0; } else{//如果i扫到的不是空格,那么开始计算单词的长度 word_length++; } } if(max<word_length){//此乃用于最长的单词在结尾的情况 max=word_length; p=i; } char longest_word[255]; for(p=p-max,i=0;max>0;max--,p++,i++){ longest_word[i]=s[p]; } longest_word[i]='\0'; return longest_word; } void main(){ char s[255]; printf("Enter a String,please:\n"); input(s); char* longest_word=findmax(s); printf("The longest word is:%s",longest_word); }
运行结果如下:
这里求解字符串中最长的单词反倒是没什么的,就是对这个字符串从头到尾遍历,在迭代器i遍历字符串的过程中,遇到不是空格,就是遇到单词,i开始计算,通过对当前最大值max的对比,最终求出一个最长的单词。同时记录这个单词,最后的一个字母的位置,而这个最大值max就是这个单词的长度。可以倒着输出,字符串中的第p-max到第p个字母就是这个最长的单词,最后存到字符数组中返回,毕竟,除头文件stdio.h以为,在不引入头文件的情况下,C中的字符串就是一个字符数组。
由于不是列表,这里可以倒着操作。
这里的难点反倒是C语言对字符串的输入处理,
可以看到代码,专门为了字符串处理,我独自开了一个函数。
虽然有scanf("%s",in_buff);可以完成字符串的输入,这里in_buff为一个char指针或者char数组名,但是如果in_buff作为一个char指针,那么在从标准 输入读取数据时,将无法确定要读取的字节数。这是一个著名的漏洞,当用户输入超出函数使用的数组范围时将造成缓冲区溢出。因此,不能将in_buff定义为一个char指针,而要定义为一个数组名。如果作为一个数组名的情况,虽然C语言会把字符串读进in_buff中,但是字符串之后的字符则无法填充,因此,必须有条语句为char in_buff[BUFFER_SIZE+1]=‘\0’,其中BUFFER_SIZE为读入字符串的长度,对in_buff这个数组左“封口”处理。否则在利用printf("%s",in_buff);输出in_buff的时候,in_buff这个字符串数组之后的剩余空间同样会被输出出来,这也就是VC中著名的“烫烫烫烫……”错误输出。
封口之后,printf遇到‘\0‘就不再读取了。
这里可以见到C语言是多么古老的一门语言,很多地方需要自己处理。
版权声明:本文为博主原创文章,未经博主允许不得转载。