PLGT 2021-06-07 14:33 采纳率: 66.7%
浏览 451
已结题

求大佬帮帮孩子这到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条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月11日

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算