- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
继续我之前的问题:
Accessing local variables from void functions
从那以后,我已经能够获得我需要的数据,现在我正在尝试比较传递给函数的每个 struct
元素的 string name
属性。
这是我当前的代码:
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
struct Nutrient {
string name, units;
double amount, calories;
};
struct Recipe {
string title;
double servings;
};
struct Ingredient {
string name, units;
double amount;
};
vector<Nutrient> readNutrients(istream& fin) {
vector<Nutrient> nutrients;
/**ifstream in(input_file.c_str());*/
string line;
while (getline(fin, line)) {
Nutrient n;
int pos = line.find(';');
n.name = line.substr(0, pos);
line = line.substr(pos + 1);
istringstream iss(line);
iss >> n.amount >> n.units >> n.calories;
nutrients.push_back(n);
}
return nutrients;
}
Recipe readRecipe(istream& fin) {
Recipe recipe;
string line;
int lineCount = 0;
while (getline(fin, line)) {
lineCount++;
istringstream iss(line);
if (lineCount == 1) {
iss >> recipe.title;
}
else if (lineCount == 2) {
iss >> recipe.servings;
}
}
return recipe;
}
vector<Ingredient> readIngredients(istream& fin) {
vector<Ingredient> ingredients;
string line;
string title; // Just grabs, doesnt return
double servings; // Just grabs, doesnt return
int lineCount = 0;
while (getline(fin, line)) {
Ingredient g;
lineCount++;
istringstream iss(line);
if (lineCount == 1) {
iss >> title;
}
else if (lineCount == 2) {
iss >> servings;
}
else {
iss >> g.amount >> g.units >> ws;
getline(iss, g.name, '\n');
cout << g.name << "\n";
ingredients.push_back(g);
}
}
return ingredients;
}
bool itemsMatch(vector<Nutrient>& nut, vector<Ingredient>& ing) {
int matchCount = 0;
for (int i = 0; i < nut.size(); i++) {
for (int j = 0; j < ing.size(); j++) {
if (nut[i].name == ing[j].name) {
cout << nut[i].name << " matched " << ing[j].name << endl;
cout << "\n";
}
else {
cout << nut[i].name << " didnt match " << ing[j].name << endl;
}
}
}
return true;
}
int main(int argc, char** argv) {
vector<Nutrient> nutri;
vector<Ingredient> ingri;
Recipe rec;
bool match;
ifstream finNutr(argv[1]);
ifstream finIngr(argv[2]);
ifstream finReci(argv[2]);
nutri = readNutrients(finNutr);
ingri = readIngredients(finIngr);
rec = readRecipe(finReci);
match = itemsMatch(nutri, ingri);
return 0;
}
bool itemsMatch()
是造成问题的原因。这是最后的输出:
graham crackers
milk chocolate
marshmallows
graham crackers didnt match graham crackers
graham crackers didnt match milk chocolate
graham crackers didnt match marshmallows
milk chocolate didnt match graham crackers
milk chocolate didnt match milk chocolate
milk chocolate didnt match marshmallows
cheese, swiss didnt match graham crackers
cheese, swiss didnt match milk chocolate
cheese, swiss didnt match marshmallows
marshmallows didnt match graham crackers
marshmallows didnt match milk chocolate
marshmallows matched marshmallows
可见,有几个字符串确实匹配,但出于某种原因它说它们不匹配,我不确定为什么。
arg1 内容
graham crackers; 2 squares 59
milk chocolate; 1 bar 235
cheese, swiss; 1 oz 108
marshmallows; 1 cup 159
arg2 内容
S'mores
2
4 squares graham crackers
1 bar milk chocolate
2 large marshmallows
最佳答案
我的猜测是您的输入文件有 DOS 行结尾,这是两个字符的序列:"\r\n"
当您使用 getline
时,它会读取到 \n
,因此 \r
会包含在您从文件。这意味着您从第二个文件中读取的成分是这些字符串:
S'mores\r
2\r
4 squares graham crackers\r
1 bar milk chocolate\r
2 large marshmallows
请注意,最后一行后没有 "\r\n"
,因此读取“marshmallows”时没有 \r
回车符。
在另一个文件中,成分不在行尾,因此 \r
回车符不会读入 name
字符串中营养素。这意味着当您比较正在比较的字符串时:
"graham crackers" == "graham crackers\r" -> false
"milk chocolate" == "milk chocolate\r" -> false
"marshmallows" == "marshmallows" -> true
解决方案是手动删除 \r
回车符,或者转换您的输入文件以删除回车符(或者停止使用 Windows,它有这种愚蠢的约定并且会给初学者带来无穷无尽的问题).
要删除 \r
字符,您可以在每个 getline
之后执行此操作:
while (getline(fin, line)) {
if (!line.empty() && line.back() == '\r')
line.pop_back();
这将从行尾删除 \r
(如果存在)。
或者,如果您还停留在过去,无法使用 C++11:
while (getline(fin, line)) {
if (!line.empty() && line[line.length()-1] == '\r')
line.resize(line.length()-1);
关于c++ - 比较两个 vector<Structs> 的字符串元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058575/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!