我正在完成一项学校作业,其中一部分让我有点陷入困境。我需要让用户输入所需数量的分数,直到为分子输入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;
}
答案 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;
它不会读取整行,只读取一个令牌。此外,您只需设置分数的分子。因此,您有两种选择:
使用getline
,读一整行,然后从那里解析。
更有效地使用cin >>
,并执行以下操作:
-
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);
}