分数结构数组

时间:2012-11-26 02:41:42

标签: c++ struct

我正在完成一项学校作业,其中一部分让我有点陷入困境。我需要让用户输入所需数量的分数,直到为分子输入0,并将这些分数保存在我创建的结构中。

我试图用strtok来分割用于存储空间用户输入的c字符串,然后按“/”分隔,但是我很困难,无法获得任何正确的输出(下面的代码是main()它有一个运行时错误,第二个for循环显然会失去任何适当的den)。

实现这一目标的最简单方法是什么。

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
struct Fraction 
{
    int num, den;
};
int main()
{
    Fraction* fractions[100];
    char s[100] ;
    cout << "Enter fractions (end by entering a 0): ";
    cin >> s;
    const char* p;
    int count = 0;

    for (p = strtok( s, " " );  p;  p = strtok( NULL, "," ))
    {
        const char* frac = p;
        for (frac = strtok( s, " " );  frac;  frac = strtok( NULL, "/" ))
        {
            fractions[count]->num = (int)frac;
        count++;    
        }
    }
        return 0;
}

2 个答案:

答案 0 :(得分:4)

第一个(运行时)错误是因为 Fraction* fractions[100];

这是一个指向Fraction对象的指针数组。但是Fraction对象本身永远不会被创建/初始化。

这会导致您在fractions[count]->num = (int)frac;

处出现细分错误

你可以通过多种方式解决这个问题 的 1
Fraction fractions[100];如其他答案所示 最简单的。只有其他更改才能将->中的.更改为fractions[count]->num = (int)frac;

如果你想要有效率并且只根据需要创建尽可能多的对象,那么有两种方法可以解决它 2 a。
Fraction* fractions[100] = null;
fractions[count] = new Fraction(atoi(frac));
您正在堆上进行分配,因此需要delete完成后使用的每个对象

2 b。
std::vector<Fraction> fractions; fractions.push_back(Fraction(atoi(frac))); 更多C ++ -ish选择。 Vector(简单地说)是一个根据需要自动变大的数组,因此不需要预先设置最大尺寸。由于您正在制作对象矢量,因此您也不需要delete它们。


第二次错误为(int)frac;。我相信你想要atoi(frac)。前者会给你你不想要的字符的指针地址,而后者会正确地将字符串解析为数字


我认为你不需要内循环(对于基本分数)。只需以下即可。假设用户以,<space><num>/<den><space>,格式输入。否则小心使用strtok,因为它修改了输入字符串。 那个甚至可能是您的代码的问题..(编辑)只是为了安全,删除了嵌套的strtok调用。

fractions.push_back(Fraction(atoi(strtok(NULL,"/"),atoi(strtok(NULL," "))))

修改
@Xymostech的输入代码更清晰,并且还修复了对cin功能的误解。你可以按照他的版本。

答案 1 :(得分:4)

你不想要

Fraction* fractions[100];

你只想要

Fraction fractions[100];

第一个是指针Fractions的数组,第二个是Fractions的数组。您可能遇到的问题是您没有初始化指针。

更好的方法可能是使用std::vector<Fraction>来存储您的Fraction。然后,您可以动态添加它,并且可以根据需要存储尽可能多的Fraction


您遇到的另一个错误是您正在阅读数值的方式。当你打电话

cin >> s;

它不会读取整行,只读取一个令牌。此外,您只需设置分数的分子。因此,您有两种选择:

  1. 使用getline,读一整行,然后从那里解析。

  2. 更有效地使用cin >>,并执行以下操作:

  3. -

    while (cin >> s)
    {
        char* frac = s;
    
        if (!strcmp(s, "0")) break;
    
        char* num = strtok( frac, "/" );
        char* denom = strtok( NULL, "/");
    
        fractions[count].num = atoi(num);
        fractions[count].den = atoi(denom);
    }