2014-01-23 2 views
-1

Так что .. Прошу прощения, я сделал двойной постер. Я действительно не знал, как работает этот сайт. Тем не менее, я меняю весь свой вопрос, чтобы это было более понятно. И вот оно:Как отменить все слова в строке? C++

char s[1002]; 
cin.getline(s, 1002, '\n'); 
int k; 
int p = strlen(s); 
strcat(s, " "); 

for (int i = 0; i <= p; i++) 
{ 
    if (s[i] == ' ') 
    { 

     for (k = i - 1; (k != -1) && (s[k] != ' '); k--) 
      cout << s[k]; 
     cout << " "; 

    } 
} 

'', ',', '.' а также ';' должны быть разделителями, но мне удалось заставить его работать только с '' (интервалами).

Я не могу использовать std::string, поскольку я делаю это для домашней работы, где мне нужно сделать очень специфическую функцию - char const* reverseWordsOnly(const char*).

Что должен делать код?

Input: Reversing the letters, is; really hard. 

Output: gnisreveR eht srettel, si; yllaer drah. 
+4

Почему вы не используете 'зЬй :: string' для этого? – olevegard

+0

Потому что в школе они учат нас только тому, что я написал. Я узнал о std :: string только сегодня, и я недостаточно уверен, чтобы использовать его. – user3213110

+0

Кроме того, 'i = 0' и' k = i - 1'? И для чего нужен 'strcat'? Вам придется сканировать всю строку для «слов», т. Е. Для последовательностей букв. Если вы определили слова, верните их. –

ответ

3

Хотя я до сих пор считаю, что это дубликат, мыслительный процесс для решения это было бы так:

  1. Написать функцию, которая возвращает истину для алфавита (A-Z и A-Z), и ложь в противном случае.
  2. Начало в начале строки
  3. найти следующий знак алфавита, отметить свое местоположение (начало)
  4. Найти следующий, не знак алфавита, отметьте его местоположение (конец)
  5. Реверс символы в диапазон [начало, конец)
  6. Повторяйте шаги 3-5 до конца строки

Все это становится очень легко, когда вы используете std::string и алгоритмы, как std::reverse вместо использования сырьевых массивов и обычай. Поскольку вам разрешено использовать std::cin и std::cout (<iostream>), аргумент против использования <string> является глупым.

+0

Этот вопрос задавался не менее 3 раз, но ответы там не помогают: OP может просто заменить его код на тот, который найден в ответе, и мы, конечно, этого не хотим. – anatolyg

+0

@anatolyg Я не уверен, что я последую за тобой. Что вы пытаетесь передать? –

+0

Относительно вашего первого предложения («это дубликат») - хотя этот вопрос задавали раньше, ему нужен новый ответ; вы не можете просто перенаправить на более старый подобный вопрос. – anatolyg

0

Вы можете сохранить строку в другом массиве без символов сначала, а затем отменить новый массив. Например, если вы хотите игнорировать запятой (,) или точку с запятой (;), вы можете написать что-то вроде

while(i <= p) 
{ 
    if (s[i] == ',' || s[i] == ';') 
    { 
     i++; 

    } 
    else 
    { 
     temp[j]=s[i]; 
     j++; 
     i++; 
    } 
} 

Затем вы можете полностью изменить массив Temp.

+0

Я думаю, что я неверно истолковал. Проблема в том, что мне не нужно игнорировать их в новой строке. Мне нужно, чтобы они выступали в качестве разделителей. – user3213110

0

Вместо того, чтобы просто печатать письма, как этот

for (k = i - 1; (k != -1) && (s[k] != ' '); k--) 
    cout << s[k]; 
cout << " "; 

Проверьте, чтобы увидеть, если вам нужно игнорировать письмо, как этот

for (k = i - 1; (k != -1) && (s[k] != ' '); k--) 
    if((s[k] != ',') && (s[k] != ';') && ...other ignored chars...) 
     cout << s[k]; 
cout << " "; 
+0

Ничего не меняется ... – user3213110

+0

@ user3213110, я видел ваше редактирование и вижу, что я неправильно понял вашу потребность. Скажите, если у вас все еще есть проблемы с решением –

+0

Да, на самом деле, я знаю. Все еще не выяснили, как это вытащить. Я попытался использовать предложение if для каждого отдельного разделителя так, как я использовал его для интервала, но он только ухудшается. – user3213110

0
#include<iostream> 
#include<string> 
#include<stdio.h> 
using namespace std; 

int main(){ 
    char s[1001],ch; 
    int c=0; // for counting how many words are in the array 
    while((ch = getchar()) != '\n'){ // input string until new line 
     if ((ch>='a' && ch<='z') || (ch>='A' && ch<='Z')) // check if the input character is a letter or symbol 
      s[c++] = ch; // if its a letter then insert into the array 
    } 

    for (int i=c-1;i>=0;i--) // print the array in reverse order 
     cout<<s[i]<<" "; 

    return 0; 
} 
+0

Мне нужны буквы слов, которые были отменены, а не порядок слов. – user3213110

Смежные вопросы