码迷,mamicode.com
首页 > 其他好文 > 详细

【C】字符串的输入,求输入字符串中最长的单词

时间:2015-08-05 22:29:18      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:c语言   字符串输入   scanf   遍历   最大值   

首先,基本目标很简单,就是利用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语言是多么古老的一门语言,很多地方需要自己处理。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【C】字符串的输入,求输入字符串中最长的单词

标签:c语言   字符串输入   scanf   遍历   最大值   

原文地址:http://blog.csdn.net/yongh701/article/details/47302521

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!