需要帮助来识别空格分隔的最长字符串
我需要制作一个代码来识别由空格分隔的最长字符串。如果有相同长度的字符,请将它们写入。需要帮助来识别空格分隔的最长字符串
例: 输入= 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;
}
的问题是我不知道,非常善于炭工程。所以我不知道该怎么做。我向你询问如何使用字符集来以特定方式对字符串进行计数。
这是一个非常简单的解决方案。尝试了解代码。请注意,该代码使用#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]);
}
您跳过了一个步骤:确定单词的长度 - 他似乎不知道如何执行该基本操作。 – Barmar
使用'与fgets()'和'的strtok()'和'strlen的()' –
'CUV [i] ='/ 0'在至少两个级别上是错误的。 – mah
在'cuv [0] = big [0];'这是*未定义的行为*,因为'big'没有被初始化。即使如此,你还是在''cuv [0]'上面写了一个输入。 –