【发布时间】:2021-06-30 21:57:42
【问题描述】:
我刚开始为 MOOC 编写 C 语言。 第一周的任务是建造马里奥楼梯(使您能够在每个级别结束时到达旗帜顶部的楼梯)。 事件虽然我的程序似乎正在运行,但我在楼梯/金字塔的尽头不断收到“分段错误”。 我想知道是否有人可以向我解释为什么这个程序会出现“分段错误”?
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main(void)
{
//Initializing variables :
char str[] = "";
int z;
int i;
int n = get_int("How many stairs ?");
//Checking that the number of stairs is correct :
while (n > 8 || n < 1)
{
n = get_int("How many stairs ?");
}
//Adding each layer of stairs :
for (i = 0 ; i < n ; i = i + 1)
{
for (z = 0 ; z <= (n - i) ; z += 1)
{
strncat(str, " ", 1);
}
for (z = 0 ; z <= i ; z += 1)
{
strncat(str, "#", 1);
}
strncat(str, " ", 1);
for (z = 0 ; z <= i ; z += 1)
{
strncat(str, "#", 1);
}
for (z = 1 ; z <= (n - i) ; z += 1)
{
strncat(str, " ", 1);
}
//Going to the next layer of stairs :
strncat(str, "\n", 1);
}
//Showing the drawing of the stairs made of "#":
printf("%s", str);
}
他就是这样打算做的:
$ ./mario
Height: 8
# #
## ##
### ###
#### ####
##### #####
###### ######
####### #######
######## ########
非常感谢!
【问题讨论】:
-
char str[] = ""只有零个字符的空格和一个标记字符串结尾的空终止符;任何strncat的尝试都会导致您覆盖有用的数据结构,从而导致崩溃或其他有问题的行为几乎不可避免。 -
一个简单的修复方法是
char str[256] = "";,但您需要检查是否没有溢出 256。您可以在知道需要多少空间后分配它,或者动态增长它根据需要。 -
你为什么要在数组中存储字符呢?你熟悉
putc吗?您可以使用构建数组所需的相同类型的循环直接输出必要的字符,一次一个。
标签: c segmentation-fault cs50