需要帮助来识别空格分隔的最长字符串

问题描述:

我需要制作一个代码来识别由空格分隔的最长字符串。如果有相同长度的字符,请将它们写入。需要帮助来识别空格分隔的最长字符串

例: 输入= Java的流动车树 输出= Java的流树

她是我的代码写

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char cuv[100], big[100]; 
    int i; 
    printf("Scrieti cuvintele\n"); 
    gets(cuv); 
    cuv[0] = big[0]; 
    for(i = 0; cuv[i] = '/0'; i++){ 
     if(cuv[i] > big[i]){ 
      big[i] = cuv[i]; 
     } 
    } 
    printf("%s", big); 

    return 0; 
} 

的问题是我不知道,非常善于炭工程。所以我不知道该怎么做。我向你询问如何使用字符集来以特定方式对字符串进行计数。

+2

使用'与fgets()'和'的strtok()'和'strlen的()' –

+2

'CUV [i] ='/ 0'在至少两个级别上是错误的。 – mah

+0

在'cuv [0] = big [0];'这是*未定义的行为*,因为'big'没有被初始化。即使如此,你还是在''cuv [0]'上面写了一个输入。 –

这是一个非常简单的解决方案。尝试了解代码。请注意,该代码使用#include<string.h>的一些功能。因此,在通过代码之前,请通过string.h头文件了解它提供的标准功能。

不管怎么说,这里是一个非常基本的程序,(随意将它修改您的需要)

#include<stdio.h> 
#include<string.h> 
#define MAX 256 

int main(){ 

     char input[MAX],*tmp=NULL; 
     char *word_list[MAX],*word=NULL; 
     int flag[MAX]; 
     int i=0,index=0,m=0,largest_len=0; 

     //Get Input From User 
     printf("Enter Input:\n"); 
     fgets(input,MAX,stdin); 

     //If using fgets then use strchr() to locate '\n' and replace it with '\0'(null terminating char) 
    if((tmp=strchr(input,'\n')) != NULL){ 
     *tmp='\0'; 
     } 

     //Use strtok() function to split the sentence/input into words separated by space 
    //and store them in an array of char pointers(or more like array of strings) 
    word = strtok(input," "); 
    word_list[index] = word; 
    index++; 
    while(word != NULL && i<MAX){ 
     word=strtok(NULL," "); 
     if(word != NULL){ 
      word_list[index] = word; 
      index++; 
     } 
    } 

    //find the word with the largest lenght 
    for(i=0;i<index;i++){ 
     if(strlen(word_list[i]) >= largest_len){ 
      largest_len = strlen(word_list[i]); 
     } 
    } 

    //Then store the index of words which have their lenght equal to the largest lenght 
    for(i=0;i<index;i++){ 
     if(strlen(word_list[i]) == largest_len){ 
      flag[m] = i; 
      m++; 
     } 
    } 

    //Print the largest words 
    m=0; 
    printf("Largest Word('s):"); 
    for(i=0;i<index;i++){ 
     if(flag[m] == i){ 
      printf("%s ",word_list[i]); 
      m++; 
     } 
    } 

    return 0; 
} 

您发布的代码似乎甚至没有接近您正在尝试执行的操作 - 太多以至于无法解决问题。

这就是说,把你的“大”(完整)问题看成是一系列较小的问题,每个较小的问题比单个较大的问题更容易解决。您的问题似乎是:

1)输入您的原始数据。

2)将原始数据拆分为单词。您可以手动浏览数据以查找空间,并在找到它们时执行您认为合适的操作,或者您可以了解如何使用strtok()来为您解析数据。鉴于你对语言理解的位置,手动进行操作可能是一种更好的学习体验。

3)确定集合中最大单词的长度。

4)通过你的整个集合并输出每个长度等于最大长度的单词。


对于问题1,您似乎已经完成了这项工作(但要注意人们给出的关于更好方法的建议)。


问题2可能是最具挑战性的。有几种方法可以解决这个问题。我不打算提供解决方案,但这个片段是一个小开始:

for (i = 0; cuv[i] != '\0'; ++i) { 
    /* do something */ 
} 

注意for循环的中间项;它并没有分配到cuv[i](我指出了这一点,因为在你的发布程序中,你正在做一个分配,这实际上不是你想要的)。它将字符与标准C字符串匹配进行比较。

您需要在循环中查看每个字符,并决定是否增加当前单词,结束前一个单词,开始一个新单词或跳过重复的空白。

你需要存储一个指针,每个字的地方,这样的全套的话将提供给步骤3和4

请注意,您可以你做执行第3步这但你现在不应该。它会使你的程序更高效,但它将步骤合并在一起,并在学习的时候,你不需要这些。


问题3要求你要知道,strlen(const char *s)将返回s,其中s是正确终止C字符串的长度。

要解决这个问题,您只需遍历整套单词并检查每个单词的长度;如果长度大于以前的最大值,则会增加存储的最大值。喜欢的东西:

unsigned int maxLength = 0; 
for (i = 0; i < numberOfWords; ++i) { 
    if (strlen(word[i]) > maxLength) 
     maxLength = strlen(word[i]); 
} 

最后,对于第4步,你会通过你的词汇列表中再次重复,决定打印出哪些。例如:

for (i = 0; i < numberOfWords; ++i) { 
    if (strlen(word[i]) == maxLength) 
     printf("%s\n", word[i]); 
} 
+1

您跳过了一个步骤:确定单词的长度 - 他似乎不知道如何执行该基本操作。 – Barmar