C++ 程序停止工作

C++ 程序停止工作,c++,function,C++,Function,我试着做一个函数,用一个段落显示每个单词的第一个字母。程序在我运行它的前几次运行时运行良好,但在随后的实例中,在函数执行后停止工作。代码如下: //program that returns the first letter of each word in a paragraph #include <iostream> #include <string> using namespace std; void firstLetter(string, ostream&)

我试着做一个函数,用一个段落显示每个单词的第一个字母。程序在我运行它的前几次运行时运行良好,但在随后的实例中,在函数执行后停止工作。代码如下:

//program that returns the first letter of each word in a paragraph
#include <iostream>
#include <string>
using namespace std;

void firstLetter(string, ostream&);

int main()
{
    string paragraph;

    cout<<"Enter a paragraph."<<endl;
    getline(cin, paragraph);

    firstLetter(paragraph, cout);

    return 0;
}

void firstLetter(string words, ostream& out)
{
    for(int i= 0; i < words.length(); i++){
        out<<words[i++]<<" ";

        while(words[i] != ' '){
            i++;
        }
    }
}
//返回段落中每个单词的第一个字母的程序
#包括
#包括
使用名称空间std;
无效的第一个字母(字符串、ostream&);
int main()
{
字符串段;

cout循环就是问题所在

for(int i= 0; i < words.length(); i++){
    out<<words[i++]<<" ";

    while(words[i] != ' '){
        i++;
    }
}

在多空间、破折号(如果你不想输出它)和其他精美的排版材料之类的问题上仍然存在问题…但我希望你不需要考虑这些情况。

< P>循环是问题。

for(int i= 0; i < words.length(); i++){
    out<<words[i++]<<" ";

    while(words[i] != ' '){
        i++;
    }
}
还有很多问题,比如多个空格,破折号(如果你不想输出它)和其他精美的排版材料……但是我希望你不需要考虑这些情况。

同意LeMES。 你有“你好,世界” 打印应该是“h w”,然后是错误。因为“world”之后没有“”,导致while循环永远不会结束(并且到达某个无效的地方),所以您有一个“\0”。 我建议您检查“\0”并返回函数。 比如:

(我想你遇到的好例子应该是那些最后有空位的。)

同意里姆斯的观点。 你有“你好,世界” 打印应该是“h w”,然后是错误。因为“world”之后没有“”,导致while循环永远不会结束(并且到达某个无效的地方),所以您有一个“\0”。 我建议您检查“\0”并返回函数。 比如:


(我猜你遇到的好例子应该是那些最后有空格的。)

你需要检查
I
是否超过
while
循环中
单词的大小

while(i < words.length() && words[i] != ' '){
    i++;
}
while(i
您需要检查
i
是否超过
while
循环中
单词的大小

while(i < words.length() && words[i] != ' '){
    i++;
}
while(i
问题是,当i超过字符串的边界时,内部循环是无止境的

  void firstLetter(string words, ostream& out)
    {
        for(size_t i= 0, len = words.length(); ; i++){  // i < words.length() removed, it is checked in the inner loop
            out<<words[i]<<" ";

            while(words[i] != ' '){
                if( i == len-1 ) return;
                i++;
            }
        }
    }
void第一个字母(字符串、ostream和out)
{
对于移除的(size_t i=0,len=words.length();i++){//iout问题是,当i超过字符串的边界时,内部循环是无止境的

  void firstLetter(string words, ostream& out)
    {
        for(size_t i= 0, len = words.length(); ; i++){  // i < words.length() removed, it is checked in the inner loop
            out<<words[i]<<" ";

            while(words[i] != ' '){
                if( i == len-1 ) return;
                i++;
            }
        }
    }
void第一个字母(字符串、ostream和out)
{
对于移除的(size_t i=0,len=words.length();i++){//i
下面是程序对调试器的操作,答案应该很清楚。堆栈溢出不是人工调试器。@Leems也不是人工调试器。@MarkGarcia你是对的。我应该说:……人工驱动的调试器。;)这个问题的标题对网站的未来访问者不太可能有用。太本地化了。请按照程序使用调试器,答案应该像白天一样清楚。堆栈溢出不是人工调试器。@leemes也不是人工调试器。@MarkGarcia你说得对。我应该说:……人工驱动的调试器。;)这个问题的标题对网站的未来访问者不太可能有用。太本地化了。请参阅我的编辑,它现在对应的是o你的问题(我第一次认为你想跳过多个空格…“其中一个空格不应该递增”-这里不是这样的,是吗?@Fraser是的,这是我之前的回答的剩余部分,当时我误解了这个问题。谢谢你的提示,我要删除这一行。请参阅我的编辑,它现在对应于你的问题(我首先认为您要跳过多个空格…“其中一个空格不应该递增”-事实并非如此,是吗?@Fraser是的,这是我之前的回答的剩余部分,当时我误解了这个问题。谢谢你的提示,我将删除这一行。
std::string
的内部数据中没有
\0
,至少实现不需要。访问
单词[words.length()]
(这里就是这种情况)是未定义的行为。对于C字符串,您的代码是完美的解决方案。
std::string
的内部数据中没有
\0
,至少实现不需要。访问
words[words.length()]
(这里就是这种情况)是未定义的行为。对于C字符串,您的代码是完美的解决方案。您不想在访问
words[i]
之前断言
i
,因为
i
是循环中其他地方的增量吗?是-现在更正,谢谢。这意味着我while
循环时都会检查,对于超过2个字母的段落,这将比以前多得多。啊,这很有帮助。谢谢!在访问
单词[i]之前,您不想断言
i
因为
i
在循环中的其他地方是递增的吗?是的-现在更正了,谢谢。这意味着i循环时都会检查它,对于超过两个字母的段落来说,这将比以前多得多。啊,这很有帮助。谢谢!你落入了与我相同的陷阱:-)在
while
循环中,您可能希望将
if
移动到post increment之后,以避免访问超过末尾的字符串。@Fraser-不,这不重要,因为在字符串末尾时,“i”永远不会指向“”,它将在返回之前再执行一次迭代,比如说
words.size()
是8,在进入
while
循环时,
i
是7。您可以递增,然后访问
单词[8]
,该单词已经过了结尾。另外,如果
单词
以空格结尾,则通过删除
for
中的复选框,您可以访问
while
循环中超过结尾的两个单词。@Fraser-是和一个slig