Поэтому я пытаюсь сделать переводчик Pig Latin и пока моя программа работает, но есть только одна проблема. Я не могу иметь дело с пунктуацией, потому что, когда вводом является целое предложение, например:
Я уже ненавижу этот «язык»!
Отпуть: Я уже в пути, на этот раз «anguagelay»!
Моя программа игнорирует знаки препинания, поэтому они не отображаются в выходных данных. Вот что у меня есть:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
bool IsVowel(char letter)
{
switch(letter)
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
case 'Y':
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y':
return true;
default:
return false;
}
}void PigLatin(char *word)
{
string s1(word);
string s2;
if(IsVowel(word[0]) == true) s2 = s1 + "way";
else s2 = s1.substr(1) + s1[0] + "ay";
cout << s2 << " ";
}
int main()
{
char sentence[10000];
char *words;
cin.getline(sentence, 10000);
words = strtok(sentence, " ,.!:;""?");
while (words != NULL)
{
PigLatin(words);
words = strtok(NULL, " ,.!:;""?");
}
return 0;
}
strtok
выбрасывает разделители, и, поскольку вы указали все виды знаков препинания в качестве разделителя, ожидаемое поведение ожидается.
Если вы хотите сохранить пунктуацию, используйте strtok(sentence, " ")
вместо этого, а затем добавить логику в PigLatin
это будет обрабатывать не алфавитные символы по-разному. Лучший способ, который я могу придумать для этого, — написать цикл for для символов в строке, записывая их один за другим со специальной логикой для обработки первого и последнего символов алфавита.
Других решений пока нет …