C++ 标记化和转换为pig拉丁语

C++ 标记化和转换为pig拉丁语,c++,tokenize,C++,Tokenize,这看起来像是家庭作业,但请确保它不是家庭作业。只是在我们的C++教程中使用的一本练习,我试着在指针前面读…p> 书中的练习告诉我将一个句子拆分成标记,然后将每个标记转换成拉丁语,然后显示出来 这里的pig拉丁语基本上是这样的:ball变成了pig拉丁语中的allboy。。男孩变成了奥伊湾。。取出第一个字母,放在末尾,然后加上“是” 到目前为止,这就是我所拥有的: #include <iostream> using std::cout; using std::cin; using st

这看起来像是家庭作业,但请确保它不是家庭作业。只是在我们的C++教程中使用的一本练习,我试着在指针前面读…p> 书中的练习告诉我将一个句子拆分成标记,然后将每个标记转换成拉丁语,然后显示出来

这里的pig拉丁语基本上是这样的:ball变成了pig拉丁语中的allboy。。男孩变成了奥伊湾。。取出第一个字母,放在末尾,然后加上“是”

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

#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;
}
#包括
使用std::cout;
使用std::cin;
使用std::endl;
#包括
使用std::strtok;
使用std::strcat;
使用std::strcpy;
拉丁语(字符*);
int main()
{
字句[500];
字符*令牌;

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

< P>,我从你的例子中,对C++图书的质量提出了严重的怀疑。C++中的“基本东西”不是C指针样式的编程,而是应用高级库函数。指出,C++标准库提供了优秀的特性来处理任务。您可能希望有更好的C++书籍。
关于问题:您的
printPigLatin
可以使用现有的函数
strcpy
(或者更好的是:
strncpy
,它在缓冲区溢出方面更安全)。您的手动副本忽略了输入中的第一个字符,因为您使用的是
i+1
st位置。您还有一个断环条件,它总是测试相同的(第一个)字符。此外,这应该会导致溢出。

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

然而,您的代码的实际问题似乎是strcat的使用,我看到您在编辑中对它做了一些更改

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

我让你的程序开始工作了,把strcat拿出来用


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


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

这似乎起到了作用:

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

我现在只知道非常基本的东西,我知道的大部分都是基于C样式指针和东西…所以不知道如何使用这些。为什么我认为使用for循环是因为我不需要令牌的第一个字母,而Strucy或SrncPy将它们全部复制到临时数组……我使用DeTEL的C++如何编程第六。我没有C知识,Deitel的书非常糟糕。事实上,它是一本最糟糕的C++书籍的列表(读我链接到的讨论)。关于使用<代码> StrucP:您可以告诉函数复制什么,特别是,您可以告诉它省略第一个字母。顺便说一下,我也没有C知识:它与C++编程无关。这里说,StncPy只复制了参数中指定的第一个字符数。C++是一个C字符串,因此“0”被终止。Word由0终止。是的。但是在这个循环中告诉我指针是递增的?当*单词将不同于\n?(int i=0;* Word!=‘0’;i++){TEMP[i]=Word [i+4];}我试着这样做:for(inti=0;*word!='\0';word++,i++){temp[i]=*word;}但它不起作用..它在每个标记后打印“gibber”.它与temp的大小有关吗?你的程序与:for(inti=0;word[i]!='\0';i++{temp[i]=word i];}当然,它更简单:)不能