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

首先,基本目标很简单,就是利用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中的字符串就是一个字符数组。指针

因为不是列表,这里能够倒着操做。code

这里的难点反却是C语言对字符串的输入处理,blog

能够看到代码,专门为了字符串处理,我独自开了一个函数。字符串

虽然有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中著名的“烫烫烫烫……”错误输出。get

封口以后,printf遇到'\0'就再也不读取了。input

这里能够见到C语言是多么古老的一门语言,不少地方须要本身处理。字符串处理