C语言 在字符串中找到最长单词

#include<stdio.h>
#include<conio.h>
#include<string.h>

char p(char ch[80])
{
char ch1[20][20]; //存放每个单词
int i,n,j,s=0;
int arr[20]; //为每个单词计数
n=strlen(ch); //字符串长度
for(i=j=0;i<n;i++)
{
while(ch[i]==' '||ch[i]=='\0') //跳过空格
i++;
while(ch[i]!=' '&&ch[i]!='\0') //读取单词
{
arr[j]++; //计数
ch1[j][s]=ch[i]; //把每个字符赋值给ch1
s++; //字符数组指向下一个内存单元
}
j++; //计算单词数
}
for(i=0,s=1;i<j&&s<j;) //通过每个单词字母个数判断最长单词
{
if(arr[i]>arr[s])
s++;
else
i++;
}
if(ch1[i]>ch1[s]) //通过上面的操作得到两个最长单词 取其长单词
printf("最长的单词为:%s",ch1[i]);
else
printf("最长的单词为:%s",ch1[s]);
}

int main()
{
char c[80];
gets(c);
p(c);
getch();
return 0;
}
通过编译 但是不能计算出最长单词!

另外我的写法好像比较复杂
如果有简单的也可以

实现本功能,需要按以下步骤进行程序设计:
1、确定单词分隔符,一般情况为空格和标点符号,根据题目情况来确定标点符号是否算在单词中。 假定单词不包括标点符号,即全由字母组成
2、根据上面的特点,读取一个单词
3、计算单词长度
4、与当前最大单词长度max(初值为0)比较,如果大于max,则记录下当前单词,并将其长度赋值给max
5、重复2-4,直到读单词结束(到字符串尾)。
6、输出最长单词长度和单词

7、例程:

#include<stdio.h>
#include<string.h>
#define M 1000        
int main()
{
    int low;        // 单词的起始下标
    int high;        // 单词的结束位置
    int i;            // 循环变量 
    int count;        // 统计最长单词的长度
    int temp;        // 中间变量 
    int low_temp;
    int high_temp;
    char p[M];        // 存储有多个单词的字符指针
    gets(p);
    count = 0; 
    low = 0;
    high = 0;
    for(i = 0; i < strlen(p); i++)
    {
        temp = 0; 
        low_temp = i;
        while(p[i] != ' ' && p[i] != '\0')    // p[i] != 空格 
        {
             temp++;
             i++; 
        }
        high_temp = i-1;
        if(temp > count)
        {
            count = temp;
            low = low_temp;
            high = high_temp;
        }
    }
    for(i = low; i <= high; i++)
    {
        putchar(p[i]);
    }
    return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-09
我新写了一个,你看下吧, 主要用到了strtok()这个函数, 这个函数在做字符串切割时很有用的...

/*问题描述:
C语言 在字符串中找到最长单词
*/

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define MAX_STRING_LEN 100

void findTheMaxLen(char* string)
{
char* buf = NULL;
char* temp = NULL;
int preStringLen = 0;

for(temp = strtok(string, " "); temp; temp = strtok(NULL, " "))
{
preStringLen = strlen(temp);
buf = (char*)malloc((preStringLen + 1) * sizeof(char));
memset(buf, '\0', (preStringLen + 1) * sizeof(char));
if(strcmp(temp, buf) > 0)
strcpy(buf, temp);
}

printf("最长的字符串是: %s\n", buf);
free(buf);
buf = NULL;

}
void main()
{
char string[MAX_STRING_LEN] = {'\0'};

printf("请输入一个字符串: \n");
gets(string);

findTheMaxLen(string);

}本回答被提问者采纳
第2个回答  2010-03-09
#include "stdio.h"
#include "string.h"

void main()
{
char str[100];
int maxLength=0,length=0,index,i;
printf("input:\n");
gets(str);
for(i=0;str[i];i++){
if(str[i]!=' ') {
length++;
if(length>maxLength){
index=i;
maxLength=length;
}
}else{
length=0;
}
}
printf("the longest string is:\n");
for(i=maxLength;i!=0;i--){
printf("%c",str[index-i+1]);
}
}
第3个回答  2010-03-09
#include<stdio.h>
#include<conio.h>
#include<string.h>

void p(char ch[80])
{
int i=-1,j=0;
int start=0,mark=0;
int len=0,maxlen=0;
char out[80];
memset(out,sizeof(out),0x00);
do
{
i++;
if(ch[i]!=' '&&ch[i]!=0)
{
len++;
}
else
{
maxlen=len;
mark=i;
len=0;
}

}while(ch[i]!=0);

start=mark-maxlen;
for(i=0;i<maxlen;i++)
{
out[i]=ch[i+start];
}
out[i+1]=0;
printf("%s",out);
}

int main()
{
char c[80];
gets(c);
p(c);
getch();
return 0;
}
第4个回答  2010-03-09
何必那么复杂,一边扫描输入字符串,一边计算当前单词的长度,如果当前单词的长度大于记录的长度,就把当前单词存下来,看我的例程吧。(我的算法判断是否是单词的依据是,只要不是英文字母的字符,就是单词分割符,比如空格,逗号,句号,叹号之类都是分隔符)

函数 isalphabetic 的作用是判断一个字符是否是26个英文字母中的一个, 函数 func 的作用是扫描输入字符串,找到最长的那个单词并打印。

#include <stdio.h>
#include <string.h>

int isalphabetic(char ch)
{
if ((ch >= 'a' && ch <= 'z')||(ch >= 'A' && ch <= 'Z'))
{
return 1;
}

return 0;
}

void func(char *pStr)
{
int i, j;
int max_len = 0, cur_len;
char result[80];
memset(result, 0, sizeof(result));
for(i = 0; pStr[i] != '\0'; )
{
if (isalphabetic(pStr[i]))
{
for (j = i; pStr[j] != '\0'; j++)
{
if (!isalphabetic(pStr[j]))
break;
}
if (max_len < (j - i))
{
max_len = (j - i);
strncpy(result, &pStr[i], (j-i));
result[j-i] = '\0';
}
i = j;
}
else
{
i++;
}
}
if (max_len > 0)
printf("Longest word is \'%s\'\n", result);
}

int main()
{
char c[80];
gets(c);
func(c);
return 0;
}
相似回答