C++ cin 与 C sscanf

发布于 2024-12-12 11:04:08 字数 267 浏览 0 评论 0原文

所以我用 C 写了这个,所以 sscanf 扫描 s 但然后丢弃它,然后扫描 d 并存储它。因此,如果输入是“Hello 007”,则会扫描 Hello 但将其丢弃,并将 007 存储在 d 中。

static void cmd_test(const char *s)
{
    int d = maxdepth;
    sscanf(s, "%*s%d", &d);
}

所以,我的问题是如何在 C++ 中做同样的事情?可能使用字符串流?

So i wrote this in C, so sscanf scans in s but then discards it, then scans in d and stores it. So if the input is "Hello 007", Hello is scanned but discarded and 007 is stored in d.

static void cmd_test(const char *s)
{
    int d = maxdepth;
    sscanf(s, "%*s%d", &d);
}

So, my question is how can I do the same thing but in C++? possibly using stringstream?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

内心激荡 2024-12-19 11:04:08
#include <string>
#include <sstream>

static void cmd_test(const char *s)
{
    std::istringstream iss(s);
    std::string dummy;
    int d = maxdepth;
    iss >> dummy >> d;
}
#include <string>
#include <sstream>

static void cmd_test(const char *s)
{
    std::istringstream iss(s);
    std::string dummy;
    int d = maxdepth;
    iss >> dummy >> d;
}
世俗缘 2024-12-19 11:04:08

您无法真正提取到匿名字符串,但您可以创建一个虚拟字符串并忽略它:

#include <string>
#include <istream>
// #include <sstream> // see below

void cmd_test(std::istream & iss) // any std::istream will do!
{

  // alternatively, pass a `const char * str` as the argument,
  // change the above header inclusion, and declare:
  // std::istringstream iss(str);

  int d;
  std::string s;

  if (!(iss >> s >> d)) { /* maybe handle error */ }

  // now `d` holds your value if the above succeeded
}

请注意,提取可能会失败,因此我输入了条件。发生错误时由您决定; C++ 要做的事情是抛出异常(尽管如果您的实际函数已经传达错误,您可能只能返回一个错误)。

用法示例:

#include <iostream>
#include <fstream>

int main()
{
  cmd_test(std::cin);

  std::ifstream infile("myfile.txt");
  cmd_test(infile);

  std::string s = get_string_from_user();
  std::istringstream iss(s);
  cmd_test(iss);
}

You can't really extract into an anonymous string, but you can just make a dummy and ignore it:

#include <string>
#include <istream>
// #include <sstream> // see below

void cmd_test(std::istream & iss) // any std::istream will do!
{

  // alternatively, pass a `const char * str` as the argument,
  // change the above header inclusion, and declare:
  // std::istringstream iss(str);

  int d;
  std::string s;

  if (!(iss >> s >> d)) { /* maybe handle error */ }

  // now `d` holds your value if the above succeeded
}

Note that the extraction might fail, whence the conditional I put in. It's up to you what you do in case of an error; the C++ thing to do would be to throw an exception (though if your actual function communicates errors already, you might be able to just return an error).

Example usage:

#include <iostream>
#include <fstream>

int main()
{
  cmd_test(std::cin);

  std::ifstream infile("myfile.txt");
  cmd_test(infile);

  std::string s = get_string_from_user();
  std::istringstream iss(s);
  cmd_test(iss);
}
孤城病女 2024-12-19 11:04:08

怎么样:

#include <string>
#include <sstream>

static void cmd_test(const std::string &s)
{
    int d = maxdepth;
    std::string dont_care;
    std::istringstream in(s);
    in >> dont_care >> d;
}

What about:

#include <string>
#include <sstream>

static void cmd_test(const std::string &s)
{
    int d = maxdepth;
    std::string dont_care;
    std::istringstream in(s);
    in >> dont_care >> d;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文