【问题标题】:issues with isspace and replace()isspace 和 replace() 的问题
【发布时间】:2017-09-08 03:00:23
【问题描述】:

我正在尝试编写一个程序,该程序将读取 2 个字符的用户输入字符串“passCode”并将任何空格“”替换为“__”。我只能编辑 passCode 初始化和 cout 之间的空间。目前,当用户输入“1”时,它应该打印出“1_”,但它只是再次打印出“1”。两个 if 语句应该分别查看字符串中的每个字符,如果它是空格,则应该用下划线替换该空格。但是,它似乎不起作用。我不知道这是否是因为我需要一个 else 语句,但我不知道它需要是什么。如果字符串中没有任何空格,则无需执行任何操作。

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
   string passCode;

   passCode = "1 ";

   if (isspace(passCode.at(0)) == true){
      passCode.replace(0, 1, "_");
   }
   if (isspace(passCode.at(1)) == true){
      passCode.replace(1, 1, "_");
   }

   cout << passCode << endl;
   return 0;
}

【问题讨论】:

  • replace 不工作还是没有被调用?
  • 如果您在调试器中逐行执行代码,它会按照您的预期进行吗?
  • 不知道我怎么知道它是否不工作。我以我知道的唯一方式使用它。我也只是尝试在括号内的 isspace 参数周围加上单引号,例如 (isspace('passCode.at(0)') 但它无法编译。
  • @RachelSugg 您可以通过将打印语句放在 if 块中并检查任何输出来测试它
  • 考虑使用std::replace()代替手动替换,例如:std::replace(passCode.begin(), passCode.end(), ' ', '_'); 或者使用std::relace_if()代替,例如:std::replace_if(passCode.begin(), passCode.end(), [](char c) { return (std::isspace(c) != 0); }, '_');

标签: c++ string


【解决方案1】:

这是因为isspace 没有返回bool,而是返回了int

返回值

如果 c 确实是空白字符,则该值不同于零(即 true)。否则为零(即假)。

如果您删除 == true 部分,您的代码将按预期工作:

if (isspace(passCode.at(0))){
    passCode.replace(0, 1, "_");
}
if (isspace(passCode.at(1))){
    passCode.replace(1, 1, "_");
}

Demo.

【讨论】:

  • 这很奇怪。我的教科书有 isspace 示例作为返回真或假。
  • @RachelSugg 部署在 ideone 上的库版本返回 1&lt;&lt;13,即 8192 (demo)。
  • 是的,这行得通,但我不确定我是否理解。如果它是一个 if 语句,它对“if”有什么看法?在我看来它只是一个语句,而 if 语句将两个语句比较在一起。
  • @RachelSugg C++ 中所有需要逻辑表达式的控制结构,例如ifwhilefor,都依赖于与零的隐式比较。换句话说,如果您有if (intvalue),它与if (intvalue != 0) 相同。同样适用于其他类型的值,例如指针。
  • 仅供参考 - 中的 std::isspace() 返回一个布尔值。 中的 std::isspace 返回一个 int。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2012-06-19
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多