| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 669 人关注过本帖
标题:求大神说明该如何修改这个错误~~~~~
只看楼主 加入收藏
Hee麦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-8-3
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:12 
求大神说明该如何修改这个错误~~~~~
我写的这个string Upper(string & s);函数是为了:将string对象的内容装换为大写,但是不知道该如何一个个地读取string字符串里的字符
这个函数要求接受一个指向string对象的应用做为参数;


#include <iostream>
#include <string>
#include <cctype>
using namespace std;

string Upper(string & s);

int main()
{
    cout<<"Enter a string (q to quit): ";
    string str;
    getline(cin,str);
    Upper(str);
    while(str!="q")
    {
        cout<<"Next string (q to quit): ";
        getline(cin,str);
        Upper(str);
    }
    cout<<"Bye.\n";
    return 0;
}

string Upper(string & s)
{
    while(*s)
    {
        toupper(*s);
        s++;
    }
    return s;
}
搜索更多相关主题的帖子: include 字符串 Enter 
2012-12-23 13:17
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
string Upper(string &s)
{
    char *pStr = (char *)s.c_str();
    while(*pStr)
    {
       *pStr = toupper(*pStr);
        pStr++;
    }
    return s;
}

这样就行了,注意红色的部分
收到的鲜花
  • 寒风中的细雨2012-12-26 10:41 送鲜花  10朵   附言:const char* 读类型的......

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-23 16:36
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
s 是string对象来的 不是char  所以就s.c_str();获取其char buff指针。
获取出来的是const类型的,也就是不可以改变其内容。强行转换(就好比 不让拆?强行拆迁~~~),就可以改写他的内容了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-23 16:40
Hee麦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-8-3
收藏
得分:0 
谢谢!
2012-12-24 10:18
Hee麦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-8-3
收藏
得分:0 
回复 3楼 yuccn
你好,感谢你的解答,但是我还没解决这个问题,这个代码是我做C++ Primer Plus(第五版)第八章编程题第3题的答案,不过我按照你的修改后没能按题目要求正确运行。

原题目:编写一个函数,他接受一个指向string对象的引用作为参数,并将该string对象的内容转换为大写,为此可使用函数toupper()。然后编写一个程序,它通过使用一个循环让你能够用不同的输入来测试这个函数,改程序的运行情况如下:
Enter a string (q to quit): go away
GO AWAY
Next string (q to quit): good grief!
GOOD GRIEF!
Next string (q to quit):q
Bye.

而我现在写的代码是:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string Upper(string & s);
int main()
{
    cout<<"Enter a string (q to quit): ";
    string str;
    getline(cin,str);
    Upper(str);
    while(str!="q")
    {
        cout<<"Next string (q to quit): ";
        getline(cin,str);
        Upper(str);
    }
    cout<<"Bye.\n";
    return 0;
}

string Upper(string &s)
{
    char *pStr = (char *)s.c_str();
    while(*pStr)
    {
       *pStr = toupper(*pStr);
        pStr++;
    }
    return s;
}

结果运行后,功能没实现,我不知道错在哪里了。如果你有空的话,请帮我看一下 指出错误的地方或该怎么修改,谢谢!
2012-12-24 10:48
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:5 
帮你修改了一下 供参考
程序代码:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string Upper(string & s);
int main()
{
    string str;
    cout<<"Enter a string (q to quit): ";
    while (1)
    {
        getline(cin,str);
        if (str == "q")
        {
            break;
        }
        cout<<Upper(str)<<endl;
        cout<<"Next string (q to quit): ";
    }
    cout<<"Bye.\n";
    return 0;
}

string Upper(string &s)
{
    string::size_type i =0;
    for (; i<s.size(); ++i)
    {
        s[i] = toupper(s[i]);
    }

    return s;
} 

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-12-24 13:04
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:0 
楼主 你的程序少了输出 所以看不见 可以加上cout<<Upper(str)<<endl;

但是你的while循环有问题,q是退出不了的  你可以参考下上面的

以下是引用Hee麦在2012-12-24 10:48:21的发言:

你好,感谢你的解答,但是我还没解决这个问题,这个代码是我做C++ Primer Plus(第五版)第八章编程题第3题的答案,不过我按照你的修改后没能按题目要求正确运行。

原题目:编写一个函数,他接受一个指向string对象的引用作为参数,并将该string对象的内容转换为大写,为此可使用函数toupper()。然后编写一个程序,它通过使用一个循环让你能够用不同的输入来测试这个函数,改程序的运行情况如下:
Enter a string (q to quit): go away
GO AWAY
Next string (q to quit): good grief!
GOOD GRIEF!
Next string (q to quit):q
Bye.

而我现在写的代码是:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string Upper(string & s);
int main()
{
    cout<<"Enter a string (q to quit): ";
    string str;
    getline(cin,str);
    Upper(str);
    while(str!="q")
    {
        cout<<"Next string (q to quit): ";
        getline(cin,str);
        Upper(str);
    }
    cout<<"Bye.\n";
    return 0;
}

string Upper(string &s)
{
    char *pStr = (char *)s.c_str();
    while(*pStr)
    {
       *pStr = toupper(*pStr);
        pStr++;
    }
    return s;
}

结果运行后,功能没实现,我不知道错在哪里了。如果你有空的话,请帮我看一下 指出错误的地方或该怎么修改,谢谢!

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-12-24 13:16
Hee麦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-8-3
收藏
得分:0 
回复 7楼 mmmmmmmmmmmm
感谢,我把你给我的代码运行之后,出现了新问题是:输入字符串后要按两次才显示转换后的大写,我认为是getline()函数保留回车符,下一次读取会先读取回车符,我就在循环里加了一句cin.get();不过还是没能解决。

while (1)
    {
        getline(cin,str);
        cin.get();
        if (str == "q")
        {
            break;
        }
        cout<<Upper(str)<<endl;
        cout<<"Next string (q to quit): ";
    }
    cout<<"Bye.\n";
    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册
2012-12-24 18:42
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:0 
这个是VC6 的BUG  在后面的版本已经修复了

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-12-26 09:09
Hee麦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-8-3
收藏
得分:0 
好的,谢谢
2012-12-26 14:09
快速回复:求大神说明该如何修改这个错误~~~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043707 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved