将尴尬的cstring拆分成不同的数组?

时间:2014-02-06 06:01:04

标签: c++ arrays char fstream cstring

好的,所以这是交易。这是一个学校项目,我们不能使用#include<字符串>。 基本上,对于我们将要处理的任何字符串,我们必须使用cstrings或以null终止符结尾的char数组。基本上是同样的事情吧?好吧,我有点麻烦。我必须以名字,姓氏,学生ID和至少5个等级阅读,但最多6个等级来自输入文件。看看下面是什么样的,但有一个问题。每个细节之间可以有任意数量的空格,最大长度为250.所以输入的一个例子如下。

Adam Zeller 452231     78    86 91   64 90       76
Barbara Young 274253 88   77  91    66  82    
Carl Wilson 112231       87    77    76   78  77    82

请注意,细节之间是否存在随机数量的空格。基本上,我需要获取名称(名字和姓氏的长度可以不同),将学生ID读入一个int,然后读取所有其他成绩(最好是一个int数组)。此外,他们可以有5或6个等级,该程序应该能够处理任何一个。我如何在世界范围内对这些数据进行排序?我想也许我可以将getline()转换为整行的cstring char数组,然后将每个位相应地分成每个数组,但我只是不知道该怎么做。无限期地,我不希望任何人给我任何代码,但也许指出我如何能够解决这个问题的正确方向。将一行数据排序为不同的变量,同时也可以在不影响数据的情况下计算5或6个等级,并且列表最长可达60行(意味着最多有60个学生,但不超过60个学生)。这只是项目的一部分,但似乎是我无法通过的一部分。同样,我不想要任何代码或直接答案,也许只是指出我可以解决这个问题的正确方向。非常感谢!

3 个答案:

答案 0 :(得分:2)

我不打算发布任何代码(按要求发布),但考虑通过strtok过滤每一行。 strtok将字符串拆分为标记,可以根据需要排列或存储它们。有关详细信息,请参阅此处:http://www.cplusplus.com/reference/cstring/strtok/

答案 1 :(得分:2)

我猜您可以按照以下步骤操作:

read a line
get the words from the line
first two words are first and last names
rest of the words are number, use atoi to get the numbers from string
continue the above till EOF

你怎么说的?可能是“isspace”c库函数会有所帮助

答案 2 :(得分:1)

从技术上讲,这是一个技巧项目/问题。

解析文件中最困难的部分就像你说的那样:处理随机数量的空格。

由于您要求无代码,我会根据您的建议给您一些提示:

您知道每行的大小最多为250个字符(包括换行符?) - 这是每行的长度,因此,因为它具有这样的规律性,你可以使用fstreams(从你的标签推断出来)使用常规文件函数一次一次读取这么多字符。

唯一的问题是存储这些令牌。如果您提前知道要存储的数量,可以定义一个c字符串数组(因为你不能使用{{ 1}})由最大数量组成,您认为将会发生。但是,因为它既不可靠又有点效率低(因为如果选择太多行存储会浪费内存),您可以将其设置为动态即可。在这方面,您可以选择使用像<string>这样的C ++容器,以便于访问和存储。

之后,计算出每行数据的值相对很容易:

首先,查看您的数据,您观察到了什么?

  • 每个单独的数据(解析命名法中的标记)由至少一个空格字符分隔。
  • 此外,名称是任何行的前两个标记,并且不包含数字。

因此任何没有空格或数字的东西属于字符串,在这种情况下:名称的一部分。

然后,您所要做的就是遍历用于存储c字符串的容器/数据结构,并使用上述标准对其进行解析。