我有这个代码,当我编译它时,它会在第一个printf之后显示Segmentation Fault 我不知道问题的原因是什么。请帮忙。感谢。
int main()
{
char puzzle[7][7];
char input[7];
int i;
int j;
int a;
printf("Enter your Tentaizu Puzzle:\n");
while (input[a] = '\n') {
scanf("%c", &input[a]);
a++;
}
for(i = 0; i < strlen(input); a++) {
j = 0;
while (j < 7) {
if (input[a] != ' ') {
puzzle[i][j] = input[a];
j++;
}
}
a++;
}
return 0;
}
示例输入
。 2。 。 。 。 。
1。 。 。 。 1。
。 。 1 2。 。 2
。 。 4 3。 。 。
。 。 。 。 。 3。
1。 。 。 1。 。
。 。 。 。 。 。 。
答案 0 :(得分:2)
您可能希望在程序开始时将a
设置为等于零。
a正在被初始化为一些未指定的,大多数可能是巨大的数字。
当您在a
处索引输入时,您正在从input
的边界(7)开始索引。
答案 1 :(得分:1)
您应该初始化变量。否则他们的初始值不会为零。所以我认为你必须初始化a=0
。
答案 2 :(得分:0)
您必须将a初始化为零以防止垃圾值(如果垃圾值为&lt; 0或&gt; 6,则分段错误正常,因为您的数组大小为7)。
另外,你应该重新考虑你的while循环,因为你想在用户输入&#39; \ n&#39;时停止,如果按Enter键,输入[a] ==&#39; \ n&#39 ;但是你增加了一个,所以测试的值不会被输入[a](这是&#39; \ n&#39;)但输入[a + 1]是&#39; \ 0&#39;或垃圾价值,但肯定不是&#39; \ n&#39;你想要一个停止值。
您可以切换
while(input[a] = '\n'){
scanf("%c", &input[a]);
a++;
}
带
while(a < 7){
scanf("%c", &input[a]);
if (input[a] == '\n')
break;
a++;
}
答案 3 :(得分:0)
这么多问题......我已使用!!
条评论更新了您的代码。我真的不清楚你到底想要完成什么。根据您的描述,输入一次读取一行,并且所有非空格字符都放入数组中。现在代码检查的项目太多,项目太少。
int main()
{
char puzzle[7][7];
char input[256]; // !! Room for 49 chars, spaces and NUL
char *p;
int x, y;
printf("Enter your Tentaizu Puzzle:\n");
for (y = 0; y < 7; y++) {
// !! use fgets to read a line; it will NUL terminate the string, and not overflow the buffer !!
if (fgets(input, sizeof(input), stdin) == NULL) {
perror("fgets");
exit(1);
}
// !! don't call strlen when scanning, just check for NUL terminator, and increment i instead of a !!
for(x = 0, p = input; *p; p++) {
// !! what was a had the same value as i, so we only need i !!
// !! filter out the newline that fgets might leave !!
if (!isspace(*p)) {
if (x < 7) {
puzzle[x++][y] = *p;
}
else {
printf("line too long\n");
exit(1);
}
}
}
if(x < 7) {
printf("line too short\n");
exit(1);
}
}
for(y = 0; y < 7; y++) {
for(x = 0; x < 7; x++) {
printf("%c ", puzzle[x][y]);
}
printf("\n");
}
return 0;
}