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

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

时间: 2024-12-28 16:10:14

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

求一个字串中最长的连续字符串

举例子来说:对于字符串"1234abcdef1234567abcdefghijklmn",这个字串中最长的连续字符串为"abcdefghijklmn". int continumax(char *outputstr,char *inputstr) { char maxrecord[100] = {0}; int maxlength = 0; char currentrecord[100] = {0}; int currentlength = 0; char valu

华为机试测试- 求有序数组中最长的等差序列

原题目是求一个无序数组中最长的等差数列. 求随机数构成的数组中找到长度大于=3 的最长的等差数列, 输出等差数列由小到大:如果没有符合条件的就输出格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5] 思路: 1.排序 2.d的取值范围是[0,max-min],共有max-min+1种情况 3.对每一种情况进行查找 4.对于公差d,要求最长的等差序列,需要两个循环,一个外循环从头到尾遍历,内循环从外循环的起始遍历点开始利用公式 arr[i]=arr[start]+len*d,假如符合就长

谭浩强 C程序设计 8.10写一函数,输入一行字符,将此字符串中最长的单词输出。

代码量稍微一大,就会出现bug,浪费很多时间,继续努力. #include <stdio.h> void main(){ void maxLen(char str[50]); char str[50]; gets(str); maxLen(str); } void maxLen(char str[50]){ int i,j=1,t=-1,start=0,m; int maxNum(int num[50]); int num[50]={0}; num[0]=-1;//num[1]放第一个单词的长

POJ 题目1743 Musical Theme(后缀数组,求一个串中最长不重叠重复子串)

Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21826   Accepted: 7467 Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the

[leetcode]720. Longest Word in Dictionary字典中最长的单词

b.compareTo(a) 这个函数是比较两个值得大小,如果b比a大,那么返回1 如果小,那么返回-1,相等返回0 如果比较的是字符串,那么比较字典编纂顺序,b靠前返回-1,靠后返回1 这个题的核心虽然是hashtable,但是这个方法还是很重要的,因为自己实现比较字符串很麻烦 /* 用一个Hashset来判断子串是不是在集合里 然后遍历出最长的就行 长度相同的用compareTo方法判断谁的字典顺序靠前 这个题最难的感觉其实是不知道compareTo方法,自己实现还挺麻烦的 */ publi

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

这是华为2013的一个机试题,会好半天才想出来,用了三个for循环,可能有点繁琐,但只要慢慢看还是好理解的, 题目: 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". #include<stdio.h> #include<string.h> void main() { char a[]="aba

输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”。 取出该字符串中所有的字母组成一个新的字符串。

#include <stdio.h>#include <string.h> /*输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”. 取出该字符串中所有的字母组成一个新的字符串.*/ void main(){ char oldStr[100] = "abDEe23dJfd343dPOddfe4CdD5ccv!23rr"; char newStr[100]; int i = 0,j = 0; for(i = 0; i

JS中同步显示并分割输入的数字字符串

题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图的效果就是用户在一个文本框中输入一串数字,然后再光标离开的时候,把数字按照每三位用逗号给分割开来,类似于老外的金钱输入效果. 效果一 同步显示分割分割输入 这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式.先贴上HTML和CSS代码: 1 <ht

字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人

输入3个字符串,要求按由小到大的字母顺序输出 如 输入franch england china,输出结果是china england franch 三个数排序输出,比较三个数的大小怎么做? a=18 b= 9 c=30 a>b 交换 a=9 b=18 可不可以用选择法?可不可以用冒泡法?但是这里用不着 例题: string1 string2 string3 temp a=18 b= 9 c=30 b>c? 交换 b中放的是b 和 c 中小的数,c中放的是bc中大的数. 如果a<b,则输出