“如果”声明没有返回正确的信息。

时间:2014-02-14 07:54:48

标签: c++

char capSentStart(char paragraph[], char newParagraph[])
{
    for(int i = 0; i < 301; ++i)
    {   
        if(paragraph[i] == '.' && paragraph[i + 1] == ' ')
        {   
            newParagraph[i] = '.';
            newParagraph[i + 1] = ' ';
            newParagraph[i + 2] = ' ';
            newParagraph[i + 3] = toupper(paragraph[i + 2]);
            ++i;
        }   
        else
        {   
            newParagraph[i] = paragraph[i];
        }   
    }   
}

如果你输入说“段落”Dude。花花公子。花花公子。花花公子。 然后cout&lt;&lt; newParagraph; 它打印相同的段落,没有任何改变。

6 个答案:

答案 0 :(得分:2)

根据您的代码,如果当前字符为".",那么您在if condition内执行了所需操作。当前字符不是"."时,请考虑这些情况。您只是复制原始段落,它取代了newParagraph中的前一个字符。

说输入:Dude. dude.

当前字符是第一个.时,迭代结束时的newParagraph为:

Dude. D___

其中_表示尚未填写的字符。

但是,在接下来的四次迭代中,我们找不到.。因此,您将数据从input复制到newParagraph,从而覆盖了更改。

Dude. dude.

修改

您的代码正在尝试将每个句子的第一个字符转换为大写字母。以下是它应该如何修改:

char capSentStart(char paragraph[], char newParagraph[])
{
    int new_paragraph_idx=0;
    for(int i = 0; i < 301; ++i)
    {   
        if(paragraph[i] == '.' && paragraph[i + 1] == ' ')
        {   
            newParagraph[new_paragraph_idx++] = '.';
            newParagraph[new_paragraph_idx++] = ' ';
            newParagraph[new_paragraph_idx++] = ' ';
            newParagraph[new_paragraph_idx++] = toupper(paragraph[i + 2]);
            ++i;
        }   
        else
        {   
            newParagraph[new_paragraph_idx++] = paragraph[i];
        }   
    }   
}

放一个实际填充new_ptr的{​​{1}},从而防止覆盖。并且还要注意字符串的界限。否则,您最终可能会遇到SIGSEGV

答案 1 :(得分:0)

在if语句的True情况下,您正在填写newParagraph,但是当您继续进行itterating时,您会在if语句的错误情况下再次覆盖它们。 Paragraph和new Paragraph应该有两个itterating变量。

为了给你一个更详细的答案,你应该告诉我们已经消耗的输出。

答案 2 :(得分:0)

您总是根据索引i撰写文章。即使您在newParagraph中写入更高的索引,然后跟随迭代也会覆盖已完成的操作。

答案 3 :(得分:0)

使用以下内容:

char capSentStart(char paragraph[], char newParagraph[])
{

    for(int i = 0,j = 0; i < 301; ++i,++j)
    {   
        if(paragraph[i] == '.' && paragraph[i + 1] == ' ')
        {   
            newParagraph[j] = '.';
            newParagraph[j + 1] = ' ';
            newParagraph[j + 2] = ' ';
            newParagraph[j + 3] = toupper(paragraph[i + 2]);
            j=j+3;
            i=i+2;
        }   
        else
        {   
            newParagraph[j] = paragraph[i];
        }   
    }   
}

答案 4 :(得分:0)

执行if(paragraph[i] == '.' && paragraph[i + 1] == ' ')中的第一次迭代,给出:

          paragraph[i] = '.'
                    ^
   paragraph = "Dude. dude.  ..."
newParagraph = "Dude. D         "

++i之后for循环中i的增量,i移至以下位置:

            paragraph[i] = 'd'
                      ^
   paragraph = "Dude. dude.  ..."
newParagraph = "Dude. D         "

但这一次,迭代执行else中的代码。

else
{
    newParagraph[i] = paragraph[i];
}

这会将newParagraph[i] D更改为paragraph[i],即d

            paragraph[i] = 'd'
                      ^
   paragraph = "Dude. dude.  ..."
newParagraph = "Dude. d         "   //'D' is changed back to 'd'

之后,newParagraph只会被覆盖到paragraph

答案 5 :(得分:0)

char capSentStart(char paragraph[], char newParagraph[])
{
    int index=0;

    for(int i = 0; i < 301; ++i)
    {  
        index=i; 
        if(paragraph[i] == '.' && paragraph[i + 1] == ' ')
        {   
            newParagraph[i] = '.';
            newParagraph[i + 1] = ' ';
            newParagraph[i + 2] = ' ';
            newParagraph[i + 3] = toupper(paragraph[i + 2]);
            index=i+3;
       }   
       else
       {   
           newParagraph[i] = paragraph[i];
       } 
       i=index;
    }   
}