1

我有一个从文件中读取行并将每行中的每个字符串存储在向量中的函数。

void openf(std::string s)
{
std::string line;
std::string b;
std::ifstream in;
in.open(s);
std::vector<std::string> vec;
if(in.is_open()) {
    std::cout << "File is open\n" << std::endl;
    while(std::getline(in,line)) {
        for(decltype(line.size()) i = 0; i != line.size(); ++i) {
            if(isspace(line[i]) || ispunct(line[i])) {
                vec.push_back(b);
                b = "";
            }
            else {
                b += line[i];
            }
        }
    }
}
for(auto a:vec)
    std::cout << a << std::endl;
in.close();
}

这有效。

但如果我这样做

if(!isspace(line[i]) || !ispunct(line[i])) {
    b += line[i];
}
else {
    vec.push_back(b);
    b = "";
}

什么都没有打印。

如果我没有逻辑 OR 语句,而只使用 !isspace 和 !ispunct ,则程序在各自情况下的行为与预期相同。

我不认为我是必需的,但我也尝试将 () 放在每个运算符周围,这样它就不会相互干扰。还是不行。

这似乎是相同的代码。为什么它在一种情况下不起作用,而在另一种情况下起作用?

4

4 回答 4

12

你有:

if (A || B)
    do this
else
    do that

要否定这一点,您需要:

if (!(A || B))
    do that
else
    do this

并且!(A || B)可以解决(!A && !B)

所以你需要写

if (!isspace(line[i]) && !ispunct(line[i]))

有关更多信息,请参阅德摩根定律

于 2013-09-03T18:33:54.497 回答
5

参考德摩根定律

更改||&&

(!A && !B) = !(A || B)

所以使用,

(!isspace(line[i]) && !ispunct(line[i]))
                   ^^

以你的第二种方式

于 2013-09-03T18:33:23.620 回答
3

这与您在工作代码中检查的条件相反。这是:

if(!isspace(line[i]) && !ispunct(line[i])) {
  b += line[i];
}
else {
  vec.push_back(b);
  b = "";
}

! isspace(x) || ! ispunct(x)永远都是true。空格不会是标点符号;标点符号不会是空格。

于 2013-09-03T18:33:52.260 回答
1

应该:

if( !(isspace(line[i]) or ispunct(line[i])) )
    b += line[i];
else {
    vec.push_back(b);
    b = "";
}

看到这个帖子

于 2013-09-03T18:37:29.613 回答