Как извлечь слова из строки и сохранить их в другом массиве в c ++

0

Как разбить 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);
}
  • 0
    для разбиения строки проверьте этот stackoverflow.com/questions/236129/…
  • 2
    Обратите внимание на две вещи: 1.) Это больше C, чем C ++ - тег C ++ здесь сбивает с толку. 2.) <iostream.h> устарела - лучше используйте <iostream> и напишите «std :: cout» или «используя пространство имен std;» в верхней части вашей программы
Показать ещё 1 комментарий
Теги:
string
split

3 ответа

5

Код в вашем примере выглядит так, как он написан на 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());
  • 1
    Для первого метода вам нужно это: #include <sstream>
0

Я бы написал две функции. Например, первый пропускает пустые символы

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 );
}
  • 0
    Остерегайтесь места на конце строки.
0

попробуйте получить слово в небольшом массиве (очевидно, ни слова не более 35 символов) вы можете получить слово, проверив два последовательных пробела, а затем поместите этот массив в функцию strlen(), а затем проверьте, было ли предыдущее слово больше, чем падение, которое слово еще сохранить новое слово
после этого не забудьте инициализировать массив слов с помощью "\ 0" или нулевого символа после каждого слова catch или это произойдет:
скажем, 1-е слово в этом массиве было "случиться" и "2", если вы не инициализируете, тогда ваш массив будет после 1-го вылова:
случаться
и второй улов:
* До * ppen

  • 0
    Почему нет слова больше 20 символов? antidisestablishmentarianism , Supercalifragilisticexpialidocious . Помимо этого, этот ответ нуждается в серьезном внимании, так как я сомневаюсь, что кто-то получит то, что вы пытаетесь описать, и, к тому же, я не уверен, что мы еще знаем, чего задает вопрос.
  • 0
    ну тогда я должен сделать правку !!! как насчет 35?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню