【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中的字符串就是一个字符数组。

由于不是列表,这里可以倒着操作。

这里的难点反倒是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语言是多么古老的一门语言,很多地方需要自己处理。

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值