我真的被这个问题困住了。我正在尝试用 C 语言编写一个程序,它将获取一个文件,并检查每一行是否按字母顺序排列。
所以文本文件
apple
banana
grape
grape
orange
该程序将打印到标准输出“Lines are in order”。如果行乱序,它会打印出行乱序并打印出现这种情况的第一对行。
我遇到的主要问题是调试,我一直遇到段错误,我不确定为什么。我不认为有一个实例我试图取消引用一个空指针,我也不认为有一个实例我试图分配比指针可以处理的内存更多的东西所以我不确定是什么问题是。
下面是我的代码,我真的是 C 语言的新手,所以如果我的代码中有任何明显或基本的缺陷,我会很高兴被告知。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(char* argv[],int argc){
char* fileN = argv[1];
FILE* file = fopen(fileN,"r");
if (file == NULL){
perror("Error: Couldn't open file");
exit(1);
}else{
char *line = malloc(101*sizeof(char));
fgets(line,101,file);
char *comp = malloc(101*sizeof(char));
while(line){
fgets(comp,101,file);
if (comp){
if(strcmp(line,comp) > 0){
printf("Lines out of order\n");
printf("%s\n",line);
printf("%s\n",comp);
free(line);
free(comp);
fclose(file);
exit(1);
}
}
line = comp;
}
printf("Lines are ordered\n");
free(line);
free(comp);
fclose(file);
exit(0);
}
}
感谢大家的帮助,这是一个可以运行的程序版本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc,char* argv[]){
char* fileN = argv[1];
FILE* file = fopen(fileN,"r");
if (file == NULL){
perror("Error: Couldn't open file");
exit(1);
}else{
char line[101], comp[101];
fgets(line,101,file);
int bool = 1;
while(line && bool){
if (fgets(comp,101,file) != NULL){
if(strcmp(line,comp) > 0){
printf("Lines out of order\n");
printf("%s",line);
printf("%s\n",comp);
fclose(file);
exit(1);
}
strncpy(line,comp,100);
}else{
bool = 0;
}
}
printf("Lines are ordered\n");
fclose(file);
exit(0);
}
}
我的错误是 A) 忘记了如何将一个字符串正确地复制到另一个字符串,以及 B) 没有意识到 fgets 在失败时会返回 null,这就是我需要用来确保我的循环真正结束的方法。
我是一名优秀的程序员,十分优秀!