2009-05-12 2 views
0

Это похоже на домашнюю работу, но будьте уверены, что это не домашнее задание. Просто упражнение в книге, которое мы используем в нашем курсе на C++, я пытаюсь читать дальше по указателям.tokenizing and conversion to pig latin

Упражнение в книге говорит мне разбить предложение на токены, а затем преобразовать каждый из них в латинский свиньи отображать их ..

свинья латинская здесь в основном так: мяч становится allboy в piglatin .. мальчик становится oybay .. взять первую букву из, положить его в конце добавьте «ау» ..

до сих пор это то, что у меня есть:

#include <iostream> 
using std::cout; 
using std::cin; 
using std::endl; 

#include <cstring> 
using std::strtok; 
using std::strcat; 
using std::strcpy; 

void printPigLatin(char *); 

int main() 
{ 
    char sentence[500]; 
    char *token; 

    cout << "Enter string to tokenize and convert: "; 
    cin.getline(sentence, 500); 

    token = strtok(sentence, " "); 

    cout << "\nPig latin for each token will be: " << endl; 

    while(token != NULL) 
    { 
     printPigLatin(token); 
     token = strtok(NULL, " "); 
    } 

    return 0; 
} 

void printPigLatin(char *word) 
{ 
    char temp[50]; 

    for(int i = 0; *word != '\0'; i++) 
    { 
     temp[i] = word[i + 1]; 
    } 

    strcat(temp, "ay"); 
    cout << temp << endl; 
} 

Я понимаю, что t он четко обозначил часть, но я не уверен, как сделать свинную латину. Я попытался начать с простого добавления «ай» к токену и посмотреть, какие результаты будут. Не знаю, почему программа переходит в бесконечную цикл и продолжает показывать «ayay» .. какие-нибудь подсказки?

EDIT: это один работает нормально сейчас, но им не уверен, как добавить первую букву маркера прежде, чем добавить «ау»

EDIT: это, как я «видеть» это сделать, но не знаю, как правильно его реализовать.

ответ

1

Вы используете строку ввода с strcat. Вам нужно либо создать новую строку для каждого токена, скопировать токен и «ay», либо просто распечатать токен, а затем «ay». Однако, если вы используете C++, почему бы не использовать итераторы istream и алгоритмы STL?

+0

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

1

Если честно, я серьезно сомневаюсь в качестве книги на C++, судя по вашему примеру. «Основной материал» в C++ - это не программирование стиля указателя на C. Скорее, он использует функциональные возможности библиотеки высокого уровня. Как отметил «On Freund», стандартная библиотека C++ предоставляет отличные возможности для решения вашей задачи. Возможно, вам понадобится search for recommendations лучших книг на C++.

Относительно проблемы: Ваш printPigLatin может использовать существующую функцию strcpy (или лучше: strncpy, который более безопасен в отношении переполнения буфера). Ваша ручная копия пропускает первый символ из ввода, потому что вы используете позицию i + 1. У вас также есть условие разбитого цикла, которое всегда проверяет один и тот же (первый) символ. Кроме того, это должно привести к переполнению в любом случае.

+0

Причина, по которой я думал об использовании цикла for потому что мне не нужна первая буква маркера, а strcpy или strncpy копирует их все в массив temp. im using cit deitel, как программировать 6-е издание. У меня нет знаний c btw. –

+0

Хорошо, книга Дейтеля * * очень плохая. На самом деле, это список самых худших книг на C++ (читайте обсуждение, к которому я привязался). Что касается использования 'strcpy': вы можете сказать функции, что копировать; в частности, вы можете сказать, что он опустил первую букву. И, кстати, у меня тоже нет знаний C: это не имеет отношения к программированию на C++. –

+0

говорит здесь, что strncpy копирует только первое число символов, указанное в аргументе. –

0

Как уже указывали люди, существует несколько других способов достижения того, что вы хотите сделать.

Однако, проблема с вашим кодом, по-видимому, связана с использованием strcat, я вижу, что вы немного изменили его в редактировании. Вот объяснение, почему исходный не работал char* and size issues

В основном указатель не выделяет достаточно памяти для добавления «ay» к предоставленной строке. Если вы создаете указатель, используя технику, показанную в ссылке, она должна работать нормально.

Я получил вашу программу для работы, принимая strcat вне и с помощью

соиЬ < < слова < < "ау" < < ENDL

0

Ваш цикл бесконечен из-за * слова! = '\ 0'.

Указатель слова не изменяется в любое время в цикле.

+0

Слово - это значение, возвращаемое strtok(). Это C-String и, таким образом, «\ 0» завершается. –

+0

слово заканчивается \ 0. Да. Но скажите мне в этом цикле, где указатель увеличивается? Когда слово будет отличаться от \ n? for (int i = 0; * word! = '\ 0'; i ++) { temp [i] = слово [i + 1]; } – MickaelFM

+0

я пытался делать это так: для (INT I = 0; * слово = '\ 0'; слово ++, я ++!) { Темп [я] = * слово; } но он не работает. Он печатает «gibber» после каждого из токенов .. это имеет какое-то отношение к размеру темпа? –

0

Это, казалось, работали:

void printPigLatin(char *word) 
{ 
    cout << word + 1 << word[0] << "ay" << endl; 
} 

Просто не уверен, если это хорошая идея, чтобы сделать это.

+0

Конечно, это проще :) cout << слово << "ay" << std :: endl; – MickaelFM