Как разбить string
и сохранить слова в отдельном массиве без использования strtok
или istringstream
и найти наибольшее слово? Я только новичок, поэтому я должен выполнить это, используя базовые функции в string.h, такие как strlen
, strcpy
и т.д. Можно ли это сделать? Я пытался это сделать, и я отправляю то, что сделал. Пожалуйста, исправьте мои ошибки.
#include<iostream.h>
#include<stdio.h>
#include<string.h>
void count(char n[])
{
char a[50], b[50];
for(int i=0; n[i]!= '\0'; i++)
{
static int j=0;
for(j=0;n[j]!=' ';j++)
{
a[j]=n[j];
}
static int x=0;
if(strlen(a)>x)
{
strcpy(b,a);
x=strlen(a);
}
}
cout<<"Greatest word is:"<<b;
}
int main( int, char** )
{
char n[100];
gets(n);
count(n);
}
Код в вашем примере выглядит так, как он написан на C. Функции, такие как strlen
и strcpy
начинаются с C (хотя они также являются частью стандартной библиотеки C++ для совместимости через заголовок cstring
).
Вы должны начать изучать C++, используя стандартную библиотеку, и все станет намного проще. Такие вещи, как разбиение строк и поиск наибольшего элемента, могут выполняться с использованием нескольких строк кода, если вы используете функции в стандартной библиотеке, например:
// The text
std::string text = "foo bar foobar";
// Wrap text in stream.
std::istringstream iss{text};
// Read tokens from stream into vector (split at whitespace).
std::vector<std::string> words{std::istream_iterator<std::string>{iss}, std::istream_iterator<std::string>{}};
// Get the greatest word.
auto greatestWord = *std::max_element(std::begin(words), std::end(words), [] (const std::string& lhs, const std::string& rhs) { return lhs.size() < rhs.size(); });
Edit: Если вы действительно хотите выкопать в nitty-gritty части, используя только функции из std::string
, вот как вы можете сделать, чтобы разделить текст на слова (я оставляю вам самое большое слово, которое не должно быть слишком сложно):
// Use vector to store words.
std::vector<std::string> words;
std::string text = "foo bar foobar";
std::string::size_type beg = 0, end;
do {
end = text.find(' ', beg);
if (end == std::string::npos) {
end = text.size();
}
words.emplace_back(text.substr(beg, end - beg));
beg = end + 1;
} while (beg < text.size());
#include <sstream>
Я бы написал две функции. Например, первый пропускает пустые символы
const char * SkipSpaces( const char *p )
{
while ( *p == ' ' || *p == '\t' ) ++p;
return ( p );
}
А вторая копирует непустые символы
const char * CopyWord( char *s1, const char *s2 )
{
while ( *s2 != ' ' && *s2 != '\t' && *s2 != '\0' ) *s1++ = *s2++;
*s1 = '\0';
return ( s2 );
}
попробуйте получить слово в небольшом массиве (очевидно, ни слова не более 35 символов) вы можете получить слово, проверив два последовательных пробела, а затем поместите этот массив в функцию strlen(), а затем проверьте, было ли предыдущее слово больше, чем падение, которое слово еще сохранить новое слово
после этого не забудьте инициализировать массив слов с помощью "\ 0" или нулевого символа после каждого слова catch или это произойдет:
скажем, 1-е слово в этом массиве было "случиться" и "2", если вы не инициализируете, тогда ваш массив будет после 1-го вылова:
случаться
и второй улов:
* До * ppen
antidisestablishmentarianism
, Supercalifragilisticexpialidocious
. Помимо этого, этот ответ нуждается в серьезном внимании, так как я сомневаюсь, что кто-то получит то, что вы пытаетесь описать, и, к тому же, я не уверен, что мы еще знаем, чего задает вопрос.