【问题标题】:program received signal SIGSEGV while using scanf程序在使用 scanf 时收到信号 SIGSEGV
【发布时间】:2016-05-08 13:40:19
【问题描述】:

我正在研究 C++ 中的算法,并试图通过将 cin 更改为 scanf 来加快其执行速度。但是当我这样做时,我开始出现 SIGSEGV 错误。

    int main(){

    int nominal;
    int check;
    string b;
    int x;
    int a;

    int i = 0;

    //cin >> a;
    scanf ("%d",&a);
    for (int i = 0; i<a; i++){
        //cin >> b;
        scanf("%s",&b); 
        std::priority_queue < int > Q;
        std::priority_queue < int, std::vector < int >, std::greater < int > > moneyBox; 
        while (b!="0"){

代码在输入第一个 while 时停止工作。有关如何修复它的任何提示?

【问题讨论】:

  • 您不能将std::stringscanf("%s",&amp;b); 一起使用。请改用getline()cin &gt;&gt; b;
  • @πάνταῥεῖ 不完全正确。他可以使用resize(big_enough),然后使用data() 成员,然后将大小设置为正确的值。
  • 除了技术性之外 - 在这里,您不会因为这种变化而加快速度。除非您是高速打字员,否则写入输入所需的时间会产生时间差异 - 如果您的更改有任何变化可以忽略不计。
  • @BitTickler 算法正在被在线法官检查

标签: c++ memory scanf segmentation-fault


【解决方案1】:

scanf() 使用与预定类型相对应的格式化字符。 "%s" 旨在将一个以空结尾的 c 字符串存储在 char 数组中。因此,scanf() 会将 c++ 字符串&amp;b 的地址误解为有效的char*,指向一个预先分配的足够大小的char 数组。这会损坏内存并可能导致 UB。

【讨论】:

  • 你不能“导致”UB。相反,程序具有未定义的行为。
  • @LightnessRacesinOrbit 好的,我已经重新制定了
  • 仍然说“可能导致 UB”。哦,好吧。
  • 感谢您的清理。整个算法基于将字符串转换为整数(取决于输入中的实际内容),因此修复可能需要我比我想象的更多时间
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多