【问题标题】:Issues with SscanfSscanf 的问题
【发布时间】:2014-02-01 17:58:33
【问题描述】:

我决定使用 sscanf 作为在 C++ 中解析字符串的更简单方法。这是我的代码示例

int x,y,level;
char type;
char *line=NULL;

if(inputMode=='M'){

    while(cin.getline(line,200)){
        sscanf(line,"(%d,%d,%d,%c)",x,y,level,type);
    }
}

我试图从中提取的格式如下所示。我需要提取三个十进制值和 char 值,并且我从中读取的文件的每一行都将具有相同的格式。我创建了一个名为 char line[200] 的 c 字符串。我只是选择了 200 作为任意大小,因为我永远不知道字符串会持续多长时间,只知道在测试时,文件中的最大数字可能是数百万。

(3,2,1,#)

我收到一条错误消息,说 %d 需要一个 int *。所以我认为将 x,y,level 和 type 更改为指针可以解决这个问题,但是编译器说 x,y,level 和 type 可能在函数中未初始化。如果有帮助,我正在使用最新的 g++ -Wall -Werror 进行编译。

【问题讨论】:

  • sscanf(line,"(%d,%d,%d,%c)",&x,&y,&level,&type);
  • “我决定使用 sscanf 作为在 C++ 中解析字符串的更简单方法”——这是一个错误的决定。 sscanf() 对于初学者来说就像不会游泳的人在 1000 米深的地方潜水一样简单。在 C++ 中,在任何情况下都不应该使用 scanf()。我什至不鼓励在 C 中使用它,因为这个函数是错误的。它有很多违反直觉的小怪癖,以至于很难正确使用它。在 C++ 中,使用标准类(std::stringstreamstd::string)和函数来解析字符串。在 C 中,使用strtok()strchr() 等。
  • 好的,谢谢,因为我已经合并了 stringstream,所以我会看看它
  • 另外,在 Stack Overflow 上发帖之前,请阅读一些关于该语言的初学者教材。这是非常基本的,我什至不明白你怎么可能可能错过这个。你显然没有学习基础教程或书籍,是吗。就目前而言,您似乎甚至不了解指针是什么,为什么scanf() 需要指针,并且您似乎不知道将参数传递给函数是如何工作的。这是一个严重的问题。
  • 我实际上做了,我看到的例子,没有使用 & 符号

标签: c++ c scanf c-strings


【解决方案1】:

您在sscanf 中的变量之前错过了& 运算符。

sscanf(line,"(%d,%d,%d,%c)", &x, &y, &level, &type);  
                             ^Notice the & operator.  

【讨论】:

    【解决方案2】:

    scanf 系列函数期望指针作为参数给出,因为它们需要修改变量,并且如果您传递一个副本,它们将修改该副本(因此这是无用的)。

    int x,y,level;
    char type;
    char *line=NULL;
    
    if(inputMode=='M'){
    
        while(cin.getline(line,200)){
            sscanf(line,"(%d,%d,%d,%c)",&x,&y,&level,&type);
        }
    }
    

    是你想做的事

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      相关资源
      最近更新 更多