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; 它打印相同的段落,没有任何改变。
答案 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;
}
}