标记字符串,识别字符时出错
Tokenizing a string, errors with recognizing char
我在学校布置C++作业时遇到了一些麻烦。我遇到的具体问题是从一个包含5到6个等级的文件中读取行。每个学生的成绩一起出现在学生姓名和身份证号码后面的一行中。这里的挑战是,等级之间可以有可变数量的空格,如果只有5个等级,则需要生成一条错误消息进行筛选,但程序要继续运行并对5个等级进行平均。输入示例:23 46 68 85 98
我很容易就得到了学生的名字和身份证,但一串数字给我带来了问题。我的计划是获取行,然后标记字符串,并将每个标记分配给数组中的一个单元格。这适用于6个等级,但当只有5个等级时,它会将垃圾分配给第六个单元。
以下是与本节相关的代码片段:
fin.getline(gradeList, 200);
grade = strtok (gradeList, " ");
while (grade != ' ')
{
gradeArr[cycler] = atoi(grade);
grade = strtok(NULL, " ");
cycler++;
}
在将每个令牌转换为int之前,我尝试对其进行isdigit检查,并为任何未通过isdigit检测的令牌写入0,但这根本不起作用。当只有5个年级时,它似乎从下一行中删除了这个名字,然后当它是它的时候,它把它变成了一个巨大的数字。
我想,当程序获取行时,它只会抓取行,直到看到结束符。这不是正在发生的事情吗?
去掉C的废话,使用真正的C++:
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
// ...
std::vector<int> grades;
std::string line;
while (std::getline(fin, line))
{
std::istringstream iss(line);
int grade;
while (iss >> grade)
{
grades.push_back(grade);
}
}
这里有一个更紧凑、更优雅的方法,使用istream迭代器和后插入器:
#include <iterator>
#include <algorithm>
// other headers as before
std::vector<int> grades;
for (std::string line; std::getline(fin, line); )
{
std::istringstream iss(line);
std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(),
std::back_inserter(grades));
}
关键是,从流中提取格式化的令牌(>>
)已经完全符合您的要求,它将令牌化和解析都包含在整数中。
istream_iterator
封装了令牌提取,并允许您将流视为已解析的令牌序列。然后,copy
算法简单地将该序列复制到一个向量中,并将其插入容器的末尾。
如果使用strtol
或strtod
,它会为您返回一个指针,指向刚刚处理的内容的末尾,因此您可以从那里继续。无需标记化:)
但听起来你的问题是你读错了行。在开始解析之前打印出
gradeList
变量
你最终应该得到这样的东西:
fin.getline(grade_text, 200);
const char* grade = grade_text;
const char* next_grade;
double grade_sum = 0;
for( int grade_count = 0; grades[grade_count] = strtol(grade, &next_grade, 10), next_grade > grade; ++grade_count )
grade_sum += grades[grade_count];
double mean_grade = grade_sum / grade_count;
- 分段 使用 MPI_Gather 收集字符数组时出错
- 将常量字符* 转换为字符时出错
- 读取字符串C++的字符时出错
- 为什么常量字符*到常量字符转换出错?
- 读取字符串字符时出错 - 对于数组中的字符串值
- 通过字符串::插入插入字符时出错
- 读取字符串字符时出错
- 计算字符串中字符的出现次数时出错
- C++ 使用 Strtok 读取字符串字符时出错
- C++:使用 fgets() 读取字符输入时出错
- C ++ ifstream 无法读取字符串,并且在读取字符时出错
- 尝试将常量字符 [] static_cast<>为无符号字符 * 时出错
- 从字符串中读取字符时出错
- 英特尔 TBB,parallel_pipeline,当我在阶段之间传递常量字符*时出错
- 转换(常量字符*)变量出错
- 为什么我从字符转换为字符时出错
- 读取字符串C++的字符时出错
- wcscpy_s后读取字符串字符时出错
- 读取字符串 的字符时出错.分配内存
- C++字符出错