0

这看起来像是家庭作业,但请放心,这不是家庭作业。只是我们在 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”之前添加令牌的第一个字母

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

4

5 回答 5

1

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

于 2009-05-12T06:15:07.720 回答
1

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

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

于 2009-05-12T06:47:14.623 回答
0

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

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

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

我让你的程序正常工作,取出 strcat 并使用

cout << word << "ay" << endl

于 2009-05-12T06:55:30.977 回答
0

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

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

于 2009-05-12T07:09:43.840 回答
0

这似乎奏效了:

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

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

于 2009-05-12T22:46:44.323 回答