标记化并转换为猪拉丁语

时间:2009-05-12 06:08:56

标签: c++ tokenize

这看起来像家庭作业,但请放心,这不是功课。只是我们在c ++课程中使用的书中的练习,我正在尝试提前阅读指针..

书中的练习告诉我将一个句子分成标记然后将它们转换成猪拉丁然后显示它们。

猪拉丁在这里基本上是这样的:球变成了全明星的小猪..男孩变成了oybay ..拿出第一个字母,把它放在最后然后添加“ay”..

到目前为止,这就是我所拥有的:

#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;
}

我非常清楚地理解了令牌化部分,但我不确定如何做猪拉丁...我试着通过简单地在令牌上添加“ay”开始,看看结果会是什么......不知道为什么程序进入无限循环并继续显示“ayay”..任何提示?

编辑:这个现在正常工作,但我不知道如何在添加“ay”之前添加令牌的第一个字母

编辑:这是我“看到”它完成但不确定如何正确实现它的方式..

5 个答案:

答案 0 :(得分:1)

你用strcat运行你的输入字符串。您需要为每个令牌创建一个新字符串,复制令牌和“ay”,或者只需打印令牌然后“ay”。但是,如果您使用C ++,为什么不使用istream迭代器和STL算法?

答案 1 :(得分:1)

说实话,从你的例子来看,我严重怀疑C ++书的质量。 C ++中的“基本内容”不是C指针样式编程。相反,它正在应用高级库功能。正如“On Freund”指出的那样,C ++标准库提供了出色的功能来处理您的任务。您可能想要search for recommendations更好的C ++书籍。

关于问题:您的printPigLatin可以使用现有函数strcpy(或更好:strncpy,这对缓冲区溢出更安全)。您的手动副本省略了输入中的第一个字符,因为您使用的是i + 1 st位置。您还有一个断开的循环条件,它总是测试相同的(第一个)字符。此外,这应该会导致溢出。

答案 2 :(得分:0)

正如我前面的人所指出的,还有其他几种方法可以实现你想要做的事情。

然而,您的代码的实际问题似乎是使用strcat,我看到您在编辑中稍微改了一下。以下解释了为什么最初的一个不起作用char* and size issues

基本上,指针没有分配足够的内存来将“ay”添加到提供的字符串中。如果使用链接中显示的技术创建指针,它应该可以正常工作。

我让你的程序工作,把strcat拿出来并使用

  

cout&lt;&lt;单词&lt;&lt; “ay”&lt;&lt; ENDL

答案 3 :(得分:0)

你的循环是无限的,因为* word!='\ 0'。

循环中的任何时候都不会更改单词指针。

答案 4 :(得分:0)

这似乎有效:

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

不确定这样做是否是个好主意。