【问题标题】:setTitle() function is making crash my program if not hardcoded String如果没有硬编码字符串,setTitle() 函数会使我的程序崩溃
【发布时间】:2020-07-10 03:11:56
【问题描述】:

从现在开始,我正在为我的大学迷宫游戏编程。我几乎准备好了。只是需要美化它。

在这里我想'回合制作一个 setTitle 函数。每次测试它时,它都有一些我从未见过的奇怪症状。

因此,如果我对 title[255] 数组进行硬编码,标题将被附加到 cmd 数组中。在函数中将标题设置为参数时,我将值传递给 setTitle(char title[255])(例如“* MAZE RUNNER*”),程序崩溃。

我尝试了不同的数组大小,但这种症状似乎是随机出现的。

也许是我这边的初学者错误?

void setTitle(char title[255]) {
    char cmd[] = "title ";
    strcat(cmd, title);
    system(cmd);
}

int main() {
    setTitle("Hello Stackoverflow! I hope you can help me! feelssadman:(");
    return 0;
}

【问题讨论】:

  • 你没有足够的空间来存储/concat titlecmd,切换到char cmd[255 + 6] = "title ";
  • 当您声明像char arr[] = "Hello" 这样的数组时,编译器会计算字符串的长度(在本例中为“Hello”)并将其放入[]。最后,它将被转换为char arr[6] = "Hello"。在您的情况下,cmd[] 数组的大小为 7,因此您不能向其附加任何其他内容。
  • 另外,在将数组作为参数传递时停止输入常量。当您拥有void setTitle(char title[255]) 时,编译器会忽略255 并将其视为void setTitle(char title[])。最后,title 只是一个指向chars 数组的常量指针,所以它背后的实际声明是void setTitle(const char* title)。人们通常使用[],因此很明显该函数需要一个数组而不是单个值。

标签: c gcc c99


【解决方案1】:

你的函数的问题很简单;分配给数组cmd 的大小由编译器自动完成,其长度为初始化字符串的长度。为了使您的函数正常工作,只需在声明 cmd 字符串时在 [] 之间放置一些常量。

void setTitle(char title[]) {
    char cmd[255] = "title ";
    strcat(cmd, title);
    system(cmd);
}

还请记住,声明函数参数时不需要255。 Is 被编译器忽略。您也可以将其替换为 void setTitle(const char* title)(实际上是 title),但在需要数组时将其声明为 title[] 更为常见和传统。

【讨论】:

  • 非常感谢!我会记住的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多