【问题标题】:Retrieving Integers using sscanf使用 sscanf 检索整数
【发布时间】:2014-12-03 22:22:20
【问题描述】:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
int main()
{
    char P_input[101];
    int Bug_Time[10][4];
    int Tot_Time[4];
    char rimp[10];
    cout<<"Enter Total time:"<<endl;
    cin.getline(P_input,100);
    cout<<P_input<<endl;
    sscanf(P_input, "%d Days - %d - Hours - %d - Minutes - %d Seconds", Tot_Time[0],Tot_Time[1],Tot_Time[2],Tot_Time[3]);
    cout<<Tot_Time[0]<<Tot_Time[1]<<Tot_Time[2]<<Tot_Time[3]<<endl;
    return 0;
}

返回输出

> Enter Total time:
> 0 Days - 0 - Hours - 26 - Minutes - 56 Seconds //I entered this 
> 0 Days - 0 - Hours - 26 - Minutes - 56 Seconds // It showed me this 
> 1576 1558 0 7762 //Final cout

有人可以帮我解决这个问题吗?我希望它显示“0 0 26 56”

【问题讨论】:

  • 实际上只使用std::istringstream 有什么问题?
  • sscanf 采用指向其输出参数的指针。还有更好的 C++ 方法可供使用(编辑:请参阅@πάνταῥεῖ 评论以获得更有用的 C++ 方法)。

标签: c++ string integer scanf


【解决方案1】:
sscanf(P_input, "%d Days - %d - Hours - %d - Minutes - %d Seconds", Tot_Time[0],Tot_Time[1],Tot_Time[2],Tot_Time[3]);

sscanf 函数来自 C API,不使用引用。您的所有参数都是按值传递的,并且所有整数都未初始化,因此将它们的值传递给sscanf() 没有任何意义。您需要改为通过指针传递它们。

【讨论】:

  • 这怎么不引发段错误?内存位置 0 肯定越界了?
  • @ojblas 未定义行为。由于Tot_Time 中的值未初始化,它们不是 0 并且实际上可能包含在用作指针时最终指向有效内存的值。
【解决方案2】:

sscanf() 期望 指针 指向 int%d 说明符。但是,您没有将指针传递给您的整数。调用需要如下所示:

sscanf(P_input, "%d Days - %d - Hours - %d - Minutes - %d Seconds", &Tot_Time[0], &Tot_Time[1], &Tot_Time[2], &Tot_Time[3]);

另外,你最后的 cout 没有像你说的那样在数字之间输出空格:

cout << Tot_Time[0] << ' ' << Tot_Time[1] << ' ' << Tot_Time[2] << ' ' << Tot_Time[3] << endl;

【讨论】:

  • 在我尝试时效果很好。仔细检查您输入的数据的格式。您还应该检查sscanf() 的返回值,它会告诉您它实际提取了多少值。如果它没有返回 4,那么就出了问题。
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2022-01-19
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多