注册 登录
编程论坛 C++教室

进来看一下是什么问题

hmsss 发布于 2011-07-28 00:09, 748 次点击
程序代码:
#include<iostream>
using namespace std;
char *fun(char *ss)
{
    char len=strlen(ss);
    int i;
    char t;
    for(i=0;i<len/2;i++)
    {
        t=ss[i];
        ss[i]=ss[len-1-i];
        ss[len-1-i]=t;
    }
    return ss;
}
int main()
{
    char *b=new char[10];
    cout<<"please enter number"<<endl;
    for(int i=0;i<10;i++)
    {
        cin>>b[i];
    }
    cout<<fun(b)<<endl;
    return 0;
}
字符串逆置 输出的时候前面部分为乱码,搞了很久也不清楚出在什么地方
15 回复
#2
lzt99292011-07-28 07:11
确定第三行fun前面那个*存在?
#3
我是菜鸟C2011-07-28 09:33
原因很简单,因为 char *b=new char[10];  这里,你强行定义b的长度是10,那么你的strlen就是010的长度。
当你在cin输入时,如果输入的不是10个字符(比如abcdefg),那么后面的三个地址将是空的。所以逆序过来后你的前面会有乱码。
不知道这样讲清晰不清晰。

第二,你用了new之后请一定记得用delete释放!!!
#4
xg56992011-07-28 22:16
字符串逆置为什么要这么麻烦还特意外面去弄个乱七八糟的函数?
#include <iostream>
#include <string>
using namespace std;

void main()
{
  string a;
  int b;
  cout<<"please enter number"<<endl;
  getline(cin,a);
  b=a.length();
  for(int i=0;i<b;i++)
      cout<<a[b-1-i];
}
这样很简单不就好了吗?

#5
hmsss2011-07-28 23:18
回复 2楼 lzt9929
这个真的是存在的。
#6
hmsss2011-07-28 23:25
回复 3楼 我是菜鸟C
不管是固定还随机的,我输入全部的字符都一样,输出前面部分为乱码。比如输入这样一个字符串,不包括括号( q w e r t y u i o p )输出为( 6qds g礔  poiuytrewq ) 请高人指点啊。
#7
hmsss2011-07-28 23:26
回复 4楼 xg5699
想练习一下函数
#8
xg56992011-07-28 23:49
其实是for循环问题,没有for循环cin后strlen()返回的字符串数值是对的,否则用永远是17;
还有你的len最好定义为int
#9
xg56992011-07-29 00:02
回复 7楼 hmsss
#include<iostream>
using namespace std;
char *fun(char *ss)
{
    char len=strlen(ss);
    int i;
    char t;
    for(i=0;i<len/2;i++)
    {
        t=ss[i];
        ss[i]=ss[len-1-i];
        ss[len-1-i]=t;
    }
    return ss;
}
int main()
{
    char *b=new char[10];
    b[10]='\0';
    cout<<"please enter number"<<endl;
    for(int i=0;i<10;i++)
    {
        cin>>b[i];
    }
    cout<<fun(b)<<endl;
    return 0;
}

我知道了,是b这个字符串没有加结束标志,加了以后就不会出现问题了,string就是自动的,给你好的string类不用 char用起来非常不方便
 b[10]='\0';
加了这个程序就不出错了



[ 本帖最后由 xg5699 于 2011-7-29 00:03 编辑 ]
#10
hmsss2011-07-29 00:02
回复 8楼 xg5699
能否解释一下for之后总是是17?刚刚我调试了一下知道问题出在for循环那里,但就想不明白为什么?
#11
xg56992011-07-29 00:04
回复 10楼 hmsss
在楼上自己看
#12
hmsss2011-07-29 00:05
回复 9楼 xg5699
要加装<<endl;?我试一下。我是菜鸟不太会用string类。
#13
xg56992011-07-29 00:12
回复 12楼 hmsss
不是加装endl,
因为你定义的char *b=new char [10]
在数组b[10]的元素中的没有字符串'\0'结束标志的!
什么是字符串?有字符串'\0'结束标志的数组叫字符串不然就是字符!
cin函数他是自动检测遇到'\0'结束标志就停止录入了,而在你的for循环中的*b是没有字符串'\0'结束标志的,所以程序出错了
至于为什么给你17这个数字我也不清楚,我也是初学的,反正按照规矩做就不会出问题
所以我加了
b[10]='\0';
就编译正确了;
你用数组前后换位的想法还是挺不错的,主程序没有问题,就是加个字符串结束标志就行了

[ 本帖最后由 xg5699 于 2011-7-29 00:15 编辑 ]
#14
hmsss2011-07-29 00:23
真的很谢谢你!
#15
hmsss2011-07-29 00:28
回复 13楼 xg5699
真的很谢谢你!
#16
xg56992011-07-29 11:40
回复 15楼 hmsss
不客气

[ 本帖最后由 xg5699 于 2011-7-29 14:03 编辑 ]
1