Обратное слово, используя манипуляции со строками


#include<stdafx.h>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;
string temp[10];
void extract(char * c)
{
    int ind = 0;

    //char *temp = (char *)malloc(sizeof(char));
    while(*c!= NULL)
    {
        if(*c!= ' ') // read all chars in a word and store in temp.
        {
        temp[ind]= temp[ind] + *c;
        c++;

        }
        else if(*c== ' ') // reached end of word
        {
        c++;
        ind++;
        }
    }
    int length = sizeof(temp)/sizeof(temp[0]);
    printf("The reversed string is");
    for(int i=length;i>=0;i--)
    {
    cout<<temp[i];// not able to print it with printf statement
    }

}


void main()
{
char *c = "seattle is good";
extract(c);

}

Это должно печатать предложения в обратном порядке . Вход "Сиэтл-это хорошо" Выход выше будет "хорошим Сиэтл" У меня 2 вопроса , 1. Я использую здесь строковый массив размером 10. Как я могу сделать его динамическим? 2. Почему-то в printf("%с", "темп" [я]) не дает мне правильные результаты(в самом конце метода извлечения). Затем я использовал cout и это было прекрасно. Любые идеи, почему? Я делаю что-то глупо?

Описание Алгоритма:

  • Взять входную строку как массив char.
  • Извлечения слов из строки, глядя на пустое пространство.
  • Хранить каждое слово в временный массив строк. темп[0] = Сиэтл температура[1] = это Темп[2] = хорошо
  • Затем петли назад через этот временный массив и содержание печати.


11655
3
задан 11 марта 2011 в 10:03 Источник Поделиться
Комментарии
1 ответ

В ответ на ваши конкретные вопросы:


  1. Использовать вектор. Используя вектор, вы можете просто добавить к концу и он будет изменять себя по мере необходимости.

  2. Вы не можете использовать функции printf с строкуs в качестве функции printf - это функция и не знаете с++ строкуС. В любом случае следует избегать функции printf в C++ код.


Общие замечания по коду:

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

Как правильно включать заголовочные файлы языка C на C++, чтобы использовать #включать не включать . Далее вам следует избегать в C-функции, когда есть хорошие альтернативы на C++ и вы, как правило, не следует смешивать с помощью stdio с С++библиотеки iostream. В этой программе я не верю, что вам нужна заголовков с включить.


string temp[10];

Я не вижу никакой причины для глобального хранения в качестве глобальной переменной. Вы должны переместить его как локальную переменную внутри экстракт способ. И как я уже сказал, Вы должны использовать вектор вместо массива c.

Также темп - это плохое имя переменной.


void extract(char * c)

Не смешивать с char*S и строкуs, если не надо. В этом случае вы можете использовать строкуs всю дорогу, так что вы должны определить экстракта с константной строки и фразы в качестве аргумента (обратите внимание, что приговор является также более описательное имя, чем на C).

Далее кажется, что ваш экстракт функция делает слишком много работы: это извлечение слова из предложения в массив, а потом распечатать в обратном порядке. Эти два действия должны быть сделаны две функции: экстракт (или, может быть, sentence_to_words , который является более описательным) и print_in_reverse.

Возможно, вы даже хотите использовать 3 действия: извлечь слова, изменить их, а затем распечатать их. Таким образом, ваш код ИО полностью отделен от какой-либо логики, что всегда хорошо. В качестве бонуса точке C++ уже имеет встроенную функцию обратной массив или вектор, так что никакой дополнительной работы для вас.

В любом случае вы должны были бы изменить вашу выписку функции либо возвратить извлеченные слова, а не пустота или взять вектор, в котором будет храниться добытая слова в качестве аргумента (по ссылке).


//char *temp = (char *)malloc(sizeof(char));

Этот код закомментирован в любом случае (и не делает ничего толкового, судя по всему), но в качестве общего принципа, Я хочу отметить, что нет причин, чтобы использовать malloc и за новой в C++.


int ind = 0;
while(*c!= NULL)
{
if(*c!= ' ') // read all chars in a word and store in temp.
{
temp[ind]= temp[ind] + *c;
c++;

}
else if(*c== ' ') // reached end of word
{
c++;
ind++;
}
}

С помощью вектора можно избавиться от ОС как можно просто push_back в вектор.

Далее, Если вы используете строкуs, Вы можете упростить эту часть с помощью найти , чтобы найти следующее место и функцию substr взять подстроку до этого места.


int length = sizeof(temp)/sizeof(temp[0]);

Обратите внимание, что это будет только когда-нибудь рассказывал тебе размер массива, если размер массива известен во время компиляции (что более или менее эквивалентно: "прописано в коде"). Так что если вы хотите, чтобы размер массива, чтобы быть динамичной, вы не можете использовать это. Если вы используете вектор, вы можете просто использовать темп.размер().


printf("The reversed string is");

Как я уже говорил, Нельзя смешивать студии и библиотеки iostream. Нет никаких причин, чтобы использовать функции printf здесь.


void main()

Правильное возвращаемое значение для основной - это инт, а не пустоту.


char *c = "seattle is good";

Опять же, это должны быть просто строкой приговора("Сиэтл хорошо");. Никаких причин, чтобы использовать символ*.


Если я должен был написать эту программу, я бы сделал это так:

#include <string>
#include <iostream>
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

using std::string;
using std::vector;
using std::cout;
using std::endl;
using std::reverse;

// Splits a sentence by spaces into a vector of words
void extract(const string& sentence, vector<string>& words)
{
size_t pos = 0;
while(pos != string::npos)
{
// Find position of next space
int next_space = sentence.find(" ", pos);
// Store everything up to next space in the words vector
words.push_back( sentence.substr(pos, next_space - pos));

// Continue at the next character which is not a space.
pos = sentence.find_first_not_of(" ", next_space);
}
}

// Prints the strings in the vector separated by spaces
void print_strings(const vector<string>& strings)
{
for(size_t i = 0; i < strings.size(); i++) {
cout << strings[i] << " ";
}
cout << endl;
}

int main()
{
string sentence("seattle is good");
vector<string> words;
extract(sentence, words);
reverse(words.begin(), words.end());
print_strings(words);
}

9
ответ дан 11 марта 2011 в 10:03 Источник Поделиться