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

有逻辑错误?

a874695162 发布于 2014-10-24 20:22, 590 次点击
[
程序代码:
#include<iostream>
using namespace std;
#include<string>
#include<cmath>
int savenum(char *,int &);
int main()
{   const int n=10;
        int num[n],num_found=0,k=0;/*num[n]用来储存找到的数字,num_foud用来记找到的数字的个数,k的功能见while循环*/
    char arry[20];
    cout<<"please input the arry";
    cin>>arry;
    char *p=&arry[0];
    while(*p!='\0')
    {
        if(‘0’<=*p<=‘9’ )
        {
        p=p+savenum(p,num[k]);//此语句目的是将p下移连续数字的位数个单位
        k++;//k在找到数字后加1,让num数组准备接收下一个找到的数字
        num_found++;
        }
        else p=p+1;//如果没找到数字,就让p下移一位,进而判断下一位是否是数字
    }
    for(int i=0;i<num_found;i++)
    cout<<num[i]<<" ";
    return 0;
}
int savenum(char *p,int &num)
{

 num=0;

 int k=0,move_p=0;

 while(‘0’<=*p<=‘9’)

 {
     num=num+(*p-48)*pow(10,k);//更改num[k]的值(这里想让(*p-48)乘以10的k次方)
       k++;//k随着p的移动增大
        move_p++;//每找到一个单个数字,主函数中的指针p应该下移一位
        p++;

 }

 return move_p;
}

习题要求:输入一个字符串,内有数字和非数字字符,如:
a123x456 179?320
将其中连续的数字作为一个整数,依次存放到一数组num中。例如123放在num[0]中,456放在num[1],运行后出现无法正常执行的错误,求各位指教!

[ 本帖最后由 a874695162 于 2014-10-24 21:21 编辑 ]
9 回复
#2
stop12042014-10-24 23:42
char *p=&arry[0];
if(‘0’<=*p<=‘9’ )
while(‘0’<=*p<=‘9’)

我想问下你这个指针是指向字符串? 然后跟字符对比?
#3
a8746951622014-10-25 08:40
回复 2 楼 stop1204
p不是指向字符串,而是字符串的首元素
#4
stop12042014-10-25 17:56
回复 4 楼 a874695162
没注意
你有一个死循环
while('0'<=*p<='9')
程序代码:

    while ('0' <= *p <= '9')
    {

        num = num + (*p - 48) * pow(10, k);
        k++;//k随着p的移动增大
        move_p++;
        p++;           //无限循环时这个地址自然就出现内存访问错误
    }


[ 本帖最后由 stop1204 于 2014-10-25 18:05 编辑 ]
#5
qwe8851677592014-10-25 22:52
while ('0' <= *p <= '9')
while的条件能这么写
还有是如果是运行时出现了错误,那你就看看是不是数组或指针的访问出现了越界的问题
#6
a8746951622014-10-26 12:33
回复 4 楼 stop1204
请问,什么情况下会出现死循环呢?
#7
哆啦安梦2014-10-26 22:26
回复 6 楼 a874695162
当循环条件一直为真的时候呗……
#8
哆啦安梦2014-10-26 22:30
if括号里和while的括号里不能那么写……
if('0' <= *p && *p <= '9')
while('0' <= *p && *p <= '9')要这么写才对……
按照你那么写的话先从左到右算,'0'<=p算出来的结果是1或0,这两个数再做<='9'的判断,结果一定为真,所以陷入死循环
#9
a8746951622014-10-28 08:25
回复 8 楼 哆啦安梦
知道了,谢谢!
#10
stop12042014-10-28 17:31
回复 9 楼 a874695162
教程应该有把这个细节说出来吧.语法什么的要注意.不然以后代码一多的时候想检查就很麻烦了
1