【问题标题】:What is wrong with my C++ code involving a function calling another function?我的 C++ 代码涉及调用另一个函数的函数有什么问题?
【发布时间】:2017-10-26 01:06:00
【问题描述】:
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;

// function prototypes
string boxOfStars(int w, int h);
string lineOfStars(int len);

// function definitions
string lineOfStars(int len) {
    string result = "";
    for (int j=0; j<len; j++) {
        result += "*";
    }
    return result;
}

string boxOfStars(int w, int h) {
    string result_1 = lineOfStars(w);
    for (int i=0; i<h; i++)
        cout << result_1 << endl;

    return 0;
}

int main() {

    int width, length;

    cout << ""Enter a width and length: ";
    cin >> width >> length;
    cout << boxOfStars(width, length);

    return 0;
}

这个程序的重点是在boxOfStars()函数中调用lineOfStars()函数。

当我运行程序时,我收到“Segmentation fault: 11”错误。

输入宽度和长度:5 5 ***** ***** ***** ***** ***** 分段错误:11

我已尝试在整个互联网上搜索此问题,但似乎找不到问题。

程序在终端中运行良好,但在每次输出结束时,我都会收到此错误消息。

有人可以向我解释我的代码中的错误吗?

【问题讨论】:

  • 您在boxOfStars() 中返回0。您有几个选择:在boxOfStars() 中使用cout 并使其成为void 或组成一个包含星形行的字符串,返回比字符串和cout 它在main() 中。
  • 除了导致segfault的问题,你的lineOfStars函数应该简单很多。与其在循环中添加字符串,不如只调用接受字符和长度的string 构造函数,就像return string(len, '*'); 一样。
  • @Ryan:这就是调试器的意义所在。了解如何使用一个。它会帮助你找到段错误。

标签: c++ function loops fault


【解决方案1】:

boxOfStars() 的返回类型为std::string,但它返回的是0,它被解释为一个空的char* 指针。将空的char* 指针传递给std::string 构造函数是未定义的行为

您可能希望boxOfStars() 改为返回void,而不是在您的main() 中包含cout &lt;&lt; boxOfStars(...)

【讨论】:

  • 我认为最好从boxOfStars返回一个string,并且只在main中返回cout。无论哪种方式,将 0 作为字符串返回都是不好的。
【解决方案2】:

您正试图将BoxOfStars 的结果cout 设为0。函数BoxOfStars 本身正在为星星执行cout。看来你的代码加倍了。

【讨论】:

    【解决方案3】:

    当你这样做时

    string boxOfStars(int w, int h) {
        /* ... */
        return 0;
    }
    

    您尝试返回0,但您说它返回string。所以编译器会为你添加到string的转换,就像你写的一样:

    string boxOfStars(int w, int h) {
        /* ... */
        return (string)0;
    }
    

    特别是在这种情况下,0 被解释为空指针,它将调用构造函数,该构造函数从 const char * 创建 string。尝试访问空指针(读取字符串)会导致段错误。糟糕!

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2018-09-09
      • 2013-09-25
      • 2019-06-21
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2014-05-15
      相关资源
      最近更新 更多