Gargan 2016-04-10 13:39 采纳率: 100%
浏览 1173
已采纳

从字符串到分数的构造器,在构造器函数的定义处调试时有“写入位置访问冲突”问题

#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
class Fraction
{

private:
int num, den;
public:
Fraction(char s[10]);
void set(int n, int d){ num = n; den = d;normalize(); }
int get_x(){ return num; }
int get_y(){ return den; }
private:
void normalize();
int lcd(int a,int b);
};

int main()
{
Fraction p3("12,14");
cout << p3.get_x() << endl;
cout << p3.get_y() << endl;
system("pause");
return 0;
}
Fraction::Fraction(char s[])
{
int n = 0;
int d = 1;
char *p1,*p2;
p1 = strtok(s,"/,");
p2 = strtok(NULL,"/,");
if (p1 != NULL)
{
n = atoi(p1);
}
if (p2 != NULL)
{
d = atoi(p2);
}
set(n, d);
}
void Fraction::normalize()
{
if (num == 0 || den == 0)
{

num = 0;
den = 1;
}
int n = lcd(num,den);
num /= n;
den /= n;
}
int Fraction::lcd(int a,int b)
{
if (b == 0)
{

return a;
}
else return lcd(b,a%b);
}

  • 写回答

2条回答

  • 小灸舞 2016-04-10 13:57
    关注

    有两个问题:
    1.Fraction p3("12,14");不能这样,因为"12,14"是常量字符串,strtok企图修改常量区就会报异常,要改成栈区或者堆区的字符数组或者字符串
    2.p1 = strtok(s,"/,");和p2 = strtok(NULL,"/,");楼主加一个/要干嘛?就算转义也应该是\,而且,是不用转义的
    改成p1 = strtok(s,",");p2 = strtok(NULL,",");

     #include <iostream>
    using namespace std;
    class Fraction
    {
    
    private:
        int num, den;
    public:
        Fraction(char s[10]);
        void set(int n, int d){ num = n; den = d;normalize(); }
        int get_x(){ return num; }
        int get_y(){ return den; }
    private:
        void normalize();
        int lcd(int a,int b);
    };
    int main()
    {
        char str[10] = "12,14";
        Fraction p3(str);
        cout << p3.get_x() << endl;
        cout << p3.get_y() << endl;
        system("pause");
        return 0;
    }
    Fraction::Fraction(char s[])
    {
        int n = 0;
        int d = 1;
        char *p1,*p2;
        p1 = strtok(s,",");
        p2 = strtok(NULL,",");
        if (p1 != NULL)
        {
            n = atoi(p1);
        }
        if (p2 != NULL)
        {
            d = atoi(p2);
        }
        set(n, d);
    }
    void Fraction::normalize()
    {
        if (num == 0 || den == 0)
        {
    
            num = 0;
            den = 1;
        }
        int n = lcd(num,den);
        num /= n;
        den /= n;
    }
    int Fraction::lcd(int a,int b)
    {
        if (b == 0)
        {
    
            return a;
        }
        else return lcd(b,a%b);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog