| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1152 人关注过本帖
标题:为什么我的程序编译链接没错 运行缺出错了?
只看楼主 加入收藏
caiv5
Rank: 2
等 级:论坛游民
帖 子:13
专家分:11
注 册:2009-11-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
为什么我的程序编译链接没错 运行缺出错了?
题目是这样的:将01串首先按长度排序,长度相同时,按1的个数多少进行排序,1的个数相同时再按ascll码值排序
如:
10011111
0001101
1010101
1
0
1100
输出:
0
1
1100
1010101
00001101
10011111
我的程序是
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int snum(string& str);
void main()
{
    string *s,str;
    int k,i,j;
    cout<<"输入字符串个数:  ";
    cin>>k;
    s=new string[k];
    cout<<"输入字符串:\n";
    for(i=0;i<k;i++)
        cin>>s[i];
    for(i=0;i<k-1;i++)
        for(j=i+1;j<k;j++)
           if(s[j].length()<s[i].length())   
             str=s[i],s[i]=s[j],s[j]=str;
    for(i=0;i<k-1;i++)
        if(s[i].length()==s[i+1].length())
        {
            //if(snum(s[i])>snum(s[j]))  str=s[i],s[i]=s[j],s[j]=str;
             if(snum(s[i])==snum(s[j]))    {
            if(atoi(s[i].c_str())>atoi(s[j].c_str()))  str=s[i],s[i]=s[j],s[j]=str;
            }
        }
        cout<<endl;
    for(i=0;i<k;i++)
        cout<<s[i]<<endl;
    cout<<endl;
}
int snum(string& str)
{
    int i,flag=0;
    for(i=0;i<str.length();i++)
       if(str.substr(i,1)=="1")  flag+=1;
    return flag;
}
搜索更多相关主题的帖子: 运行 编译 链接 
2009-11-19 19:18
bccnbin2009
Rank: 7Rank: 7Rank: 7
来 自:浙江
等 级:黑侠
帖 子:86
专家分:602
注 册:2009-10-5
收藏
得分:20 
你用单步跟踪调试一下,是处理长度相同的字符串时出错的

1.
for(i=0;i<k-1;i++)
        for(j=i+1;j<k;j++)
           if(s[j].length()<s[i].length())   
             str=s[i],s[i]=s[j],s[j]=str;
执行完这段程序后,j输出的值是k的值,而s数组的长度是k,那么下标最多只能是k-1
所以执行到if(snum(s[i])==snum(s[j])) 时s数组会出现溢出错误了

2.你的程序缺少 1的个数不同时的比较,这样是出不了正确结果的

下面是我帮你改的,你看看是不是你想要的结果:

void main()
{
    string *s,str;
    int k,i,j;
    cout<<"输入字符串个数:  ";
    cin>>k;
    s=new string[k];
    cout<<"输入字符串:\n";
    for(i=0;i<k;i++)
        cin>>s[i];

    for(i=0;i<k-1;i++){
        for(j=i+1;j<k;j++){
            if(s[j].length()<s[i].length())   
                str=s[i],s[i]=s[j],s[j]=str;
        }
    }
   
    for(i=0;i<k-1;i++){
        if(s[i].length()==s[i+1].length())
        {
            if(snum(s[i])==snum(s[i+1])){
                if(atoi(s[i].c_str())>atoi(s[i+1].c_str()))  
                    str=s[i],s[i]=s[i+1],s[i+1]=str;
            }
            else if(snum(s[i])>snum(s[i+1]))//1的个数不同时进行替换
                str=s[i],s[i]=s[i+1],s[i+1]=str;
        }
        cout<<endl;
    }

    for(i=0;i<k;i++)
        cout<<s[i]<<endl;

    cout<<endl;
}

其他不变

最后,你最好养成个好习惯,进行适当的注释,不然别人读你的程序,很难读懂的

滨封千里
2009-11-19 19:59
caiv5
Rank: 2
等 级:论坛游民
帖 子:13
专家分:11
注 册:2009-11-16
收藏
得分:0 
呵呵  解决了  谢谢啦
2009-11-19 20:39
快速回复:为什么我的程序编译链接没错 运行缺出错了?
数据加载中...
 
   



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

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