【问题标题】:tokenizing and converting to pig latin标记并转换为猪拉丁语
【发布时间】:2009-05-12 06:08:56
【问题描述】:

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

书中的练习告诉我将一个句子拆分为标记,然后将它们中的每一个转换为猪拉丁然后显示它们..

这里的pig latin基本上是这样的:ball在piglatin中变成allboy..boy变成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”之前添加令牌的第一个字母

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

【问题讨论】:

    标签: c++ tokenize


    【解决方案1】:

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

    【讨论】:

    • 到目前为止,我只阅读了非常基本的东西,而且我所知道的大部分内容都是基于 c 风格的指针和东西..所以还不知道如何使用它们..
    【解决方案2】:

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

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

    【讨论】:

    • 我想到使用for循环的原因是因为我不需要令牌的第一个字母,而strcpy或strncpy将它们全部复制到临时数组..我使用deitel的c++如何编程第 6 版。顺便说一句,我没有 c 知识..
    • 好吧,Deitel 的书 非常糟糕。事实上,它在有史以来最糟糕的 C++ 书籍列表中(阅读我链接到的讨论)。关于strcpy的使用:你可以告诉函数要复制什么;特别是,您可以告诉它省略第一个字母。顺便说一句,我也没有 C 知识:它与 C++ 编程无关。
    • 这里说 strncpy 只复制参数中指定的前几个字符..
    • 同意,这是用 C++ 编译的 C 代码,不是特别优雅。
    【解决方案3】:

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

    但是,您的代码的实际问题似乎是 strcat 的使用,我看到您在编辑中对其进行了一些更改。这里解释了为什么最初的那个不起作用char* and size issues

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

    我让你的程序运行起来,取出 strcat 并使用

    cout

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • word 是 strtok() 返回的值。这是一个 C 字符串,因此 '\0' 终止。
      • 单词以 \0 结尾。是的。但是在这个循环中告诉我指针在哪里递增?什么时候 *word 将不同于 \n ? for( int i = 0; *word != '\0'; i++ ) { temp[i] = word[i + 1]; }
      • 我试着这样做: for( int i = 0; *word != '\0'; word++, i++) { temp[i] = *word;但它不起作用..它在每个标记之后打印“gibber”..它与 temp 的大小有关吗?
      • 您的程序适用于: for( int i = 0; word[i] != '\0'; i++ ) { temp[i] = word[i]; }
      【解决方案5】:

      这似乎奏效了:

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

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

      【讨论】:

      • 当然,更简单:) cout
      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多