PLGT
2021-06-07 14:33
采纳率: 100%
浏览 45

求大佬帮帮孩子这到c语言程序题

给定一个英文单词和一段英文句子,假设该单词和英文句子中只包含英文字母。编写一个程序,将英文句子中出现给定单词的前后加上一个空格后输出,以实现断词。要求若单词出现在句子的开头,则此单词之前不能添加空格;若单词出现在句子结尾,则此单词之后也不能添加空格;若单词在句子中连续出现,则单词与单词之间也只用一个空格断开。在句子中查找单词时大小写无关。

【输入形式】

先从控制台输入一英文单词(长度不超过10),然后在下一行输入一条英文句子(长度不超过50)。

【输出形式】

输出断词后的英文句子。

【输入样例】

the
Theschooltheboythethe

【输出样例】

The school the boy the the

【样例说明】

给定的单词为the,在给定的英文句子中,该单词出现了四次。第一次出现在句子开头,只在该单词后添加了一个空格,之前不能添加空格。第二次出现时前后各添加了一个空格。第三次与第四次连续出现,在第三次和第四次单词出现之间只加了一个空格,并且第四次出现在句子结尾,在其后也没有添加空格。

  • 收藏

2条回答 默认 最新

  • qfl_sdu 2021-06-07 17:26
    已采纳

    代码如下,如有帮助,请采纳一下,谢谢。

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    //查找big串中所有smal串的位置,并把位置存放在pos中,nmb存放个数
    void findstr(char*big ,char* smal,int pos[],int *nmb)
    {
    	int i,j,lenb,lens;
    	lenb = strlen(big);
    	lens = strlen(smal);
    	*nmb = 0;
    	if(lens > lenb)
    		return;
    	
    	i = 0;
    	while(i < lenb-lens+1)
    	{
    		for (j = 0; j < lens;j++)
    		{
    			if(tolower(big[i+j]) != tolower(smal[j]))
    				break;
    		}
    		if (j == lens) //说明找到
    		{
    			pos[*nmb] = i;
    			(*nmb)++;
    			i += lens;
    		}else
    			i++;
    	}
    }
    
    
    int main()
    {
    	int i,nmb,shift = 0,start = 0;
    	char fat[50] = {0};
    	char sun[10] = {0};
    	int pos[50] = {0};
    	char out[100] = {0};
    	printf("请输入需要查找的单词:");
    	gets(sun);
    	printf("请输入句子:");
    	gets(fat);
    	findstr(fat,sun,pos,&nmb);
    		
    
    	for (i = 0; i < nmb; i++)
    	{
    		memcpy(out+shift,fat+start,pos[i]-start);
    		shift += pos[i] - start;
    		start = pos[i] + strlen(sun);
    		if (pos[i] == 0)
    		{
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift+=1;
    		}else if (pos[i] + strlen(sun) == strlen(fat)) //最后一个
    		{
    			//判断是否有相邻,前一个不是sun,则加空格
    			if (pos[i] - pos[i-1] != strlen(sun))
    			{
    				out[shift] = ' ';
    				shift += 1;
    			}
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    		}else if (pos[i] - pos[i-1] == strlen(sun))  //与前一个相邻
    		{
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift += 1;
    		}else
    		{
    			out[shift] = ' ';
    			shift += 1;
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift += 1;
    		}
    			
    	}
    
    	printf("结果:%s\n",out);
    
    	return 0;
    }
    已采纳该答案
    1 打赏 评论
  • qfl_sdu 2021-06-07 22:53

    修改代码如下:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    //查找big串中所有smal串的位置,并把位置存放在pos中,nmb存放个数
    void findstr(char*big ,char* smal,int pos[],int *nmb)
    {
    	int i,j,lenb,lens;
    	lenb = strlen(big);
    	lens = strlen(smal);
    	*nmb = 0;
    	if(lens > lenb)
    		return;
    
    	i = 0;
    	while(i < lenb-lens+1)
    	{
    		for (j = 0; j < lens;j++)
    		{
    			if(tolower(big[i+j]) != tolower(smal[j]))
    				break;
    		}
    		if (j == lens) //说明找到
    		{
    			pos[*nmb] = i;
    			(*nmb)++;
    			i += lens;
    		}else
    			i++;
    	}
    }
    
    int main()
    {
    	int i,nmb,shift = 0,start = 0;
    	char fat[50] = {0};
    	char sun[10] = {0};
    	int pos[50] = {0};
    	char out[100] = {0};
    	printf("请输入需要查找的单词:");
    	gets(sun);
    	printf("请输入句子:");
    	gets(fat);
    	findstr(fat,sun,pos,&nmb);
    
    	for (i = 0; i < nmb; i++)
    	{
    		memcpy(out+shift,fat+start,pos[i]-start);
    		shift += pos[i] - start;
    		start = pos[i] + strlen(sun);
    		if (pos[i] == 0)
    		{
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift+=1;
    		}else if (pos[i] + strlen(sun) == strlen(fat)) //最后一个
    		{
    			//判断是否有相邻,前一个不是sun,则加空格
    			if (pos[i] - pos[i-1] != strlen(sun))
    			{
    				out[shift] = ' ';
    				shift += 1;
    			}
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    		}else if (pos[i] - pos[i-1] == strlen(sun))  //与前一个相邻
    		{
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift += 1;
    		}else
    		{
    			out[shift] = ' ';
    			shift += 1;
    			memcpy(out+shift,fat+pos[i],strlen(sun));
    			//memcpy(out+shift,sun,strlen(sun));
    			shift += strlen(sun);
    			out[shift] = ' ';
    			shift += 1;
    		}
    
    	}
    	memcpy(out+shift,fat+pos[nmb-1]+strlen(sun),strlen(fat)-pos[nmb-1]-strlen(sun) );
    	printf("结果:%s\n",out);
    	return 0;
    }
    
    打赏 评论

相关推荐 更多相似问题