程序最后总是显示已停止工作

destinygxx 2018-03-08 02:24:34
我最近刚开始学C++,自己试着写了段程序,目的是让一个句子第一个单词的所有字母全都改为大写。程序如下,但是结果跑出来,第一个单词的所有字母确实全都大写了,但句子后面的部分却没有了,而且,程序最后总是显示“XX已停止工作”。请问大家,这是什么问题呢?
#include <iostream>
#include <string>
#include <cctype>
using std::cout;
using std::endl;
using std::cin;
using std::string;

int main()
{
string s;
cin >> s;
int cnt = 0;

while (!isspace(s[cnt]))
{
s[cnt] = toupper(s[cnt]);
++cnt;
}

cout << s << endl;
return 0;
}



...全文
685 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
destinygxx 2018-03-08
  • 打赏
  • 举报
回复
谢谢大家的回答!
mstlq 2018-03-08
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
出现异常退出的原因是越界,即while(!isspace(s[cnt]))这个判断条件是判断是否为空格,并没有在s的字符串末尾停止判断,所以总会越界的。 建议修改为:
while (cnt < s.length() && !isspace(s[cnt]))
个人认为将cnt < s.length放在前面比放在后面要好。原因自己可以考虑一下;
哈哈,这个说得对
自信男孩 2018-03-08
  • 打赏
  • 举报
回复
出现异常退出的原因是越界,即while(!isspace(s[cnt]))这个判断条件是判断是否为空格,并没有在s的字符串末尾停止判断,所以总会越界的。 建议修改为:
while (cnt < s.length() && !isspace(s[cnt]))
个人认为将cnt < s.length放在前面比放在后面要好。原因自己可以考虑一下;
mstlq 2018-03-08
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <cctype>
using std::cout;
using std::endl;
using std::cin;
using std::string;

int main()
{
    string s;
    getline(cin, s);
    int cnt = 0;

    while (!isspace(s[cnt]) && cnt < s.length())
    {
        s[cnt] = toupper(s[cnt]);
        ++cnt;
    }

    cout << s << endl;
    return 0;
}
修正代码如上,请楼主自己对照找原因
真相重于对错 2018-03-08
  • 打赏
  • 举报
回复
比如你输了 "hello world"; 结果你的s是“hello” ,根本就没有空格,while会一直执行下去,如果碰巧后面的某个地方的值等于空格,while 就结束了,但是因为 while里面的操作,破坏了堆结果出错 s 是局部变量,但是它存储具体字符的地方在堆
destinygxx 2018-03-08
  • 打赏
  • 举报
回复
多谢!不过程序最后偶尔地显示停止运行,这是为什么呢?
真相重于对错 2018-03-08
  • 打赏
  • 举报
回复
cin 是以空格代表一个输入变量的结束

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧