我正在尝试编写一个程序,该程序存储和打印所有长度超过80个字符的行。这是我的代码:
#include <stdio.h>
#include<stdbool.h>
//prints all lines that are greater than 80 characters in length.
#define MAXLENGTH 1000
#define MAXLINES 100
main(){
printf("Enter stuff\n");
char cline[MAXLINES][MAXLENGTH];
int a, b, input, loop1, loop, length, line = 0, loop2;
bool lines[MAXLINES];
for(a = 0; a < MAXLINES; a++)
for(b = 0; b < MAXLENGTH; b++)
cline[a][b] = ' ';
for (loop = 0; loop < MAXLINES; loop++)
lines[loop] = false;
while((input = getchar()) != EOF){
for(loop = 0; loop < MAXLENGTH; loop++){
cline[line][loop] += (char)input;
length++;
if(input == '\n')
break;
}
if(length > 80)
lines[line] = true;
line++;
}
for(loop1 = 0; loop1 < MAXLINES; loop1++){
lines[loop] = false;
while((input = getchar()) != EOF){
for(loop = 0; loop < MAXLENGTH; loop++){
cline[line][loop] += (char)input;
length++;
if(input == '\n')
break;
}
if(length > 80)
lines[line] = true;
line++;
}
for(loop1 = 0; loop1 < MAXLINES; loop1++){
if (lines[loop] == true)
for(loop2 = 0; loop2 < MAXLENGTH; loop2++)
putchar(cline[loop][loop2]);
printf("\n");
}
}
如果一行的长度超过80个字符,则会出现此错误:
分段错误(核心已转储)
如果没有一行超过80行,我会得到一堆像这样的随机字符:
Enter stuff
hello
�������������������������������������������������������������������������
fazer@Deamons-head:~/Programs/C$ Segmentation fault (core dumped)
然后是分割错误错误。根据输入的长度(行数和每行长度),“小问号字符”出现的数量不同。
我需要了解原因,因为我已经初始化了我的字符和数组并为其声明了内存。任何帮助表示赞赏。
您的代码中有几个问题。正如注释中提到的长度是单位化的那样,具有-Wall选项的编译器会告诉您,并且您不应该从堆栈中分配过多的内存,而应使用malloc / calloc,因为这不会使程序崩溃。当您遇到缩进/括号问题后,很难完全理解代码应该执行的操作,而且我相信您在最后两个for循环中有错别字,loop1
但递增了,loop
并且loop2
被使用了。
最后,分割错误可能是由于错误地使用引起的getchar
,您line
每次从中读取一个char时都stdin
在增加,最后您可能有100多个带有1个char的行,您应该使用fgets
它将直接读取一行。
这是我想做的一些代码
#include <stdio.h>
#include<stdbool.h>
#include <string.h>
//prints all lines that are greater than 80 characters in length.
#define MAXLENGTH 1000
#define MAXLINES 100
int main(){
printf("Enter stuff\n");
char cline[MAXLINES][MAXLENGTH];
int a, b, loop1, loop, line = 0;
bool lines[MAXLINES];
for(a = 0; a < MAXLINES; a++)
for(b = 0; b < MAXLENGTH; b++)
cline[a][b] = ' ';
for (loop = 0; loop < MAXLINES; loop++)
lines[loop] = false;
while((fgets(cline[line], MAXLENGTH, stdin)) != NULL){
if(strlen(cline[line]) > 80)
lines[line] = true;
line++;
if(line == MAXLINES) break;
}
for(loop1 = 0; loop1 < MAXLINES; loop1++){
if (lines[loop1] == true)
printf("%s\n", cline[loop1]);
}
}
最后一件事,核心转储是程序崩溃时所用内存的副本,像gdb这样的调试器可以读取它,并且您会发现这line
已经过去了MAXLINES
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句