gpt4 book ai didi

c - 读取文本文件时C程序中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:26:48 25 4
gpt4 key购买 nike

我想从文本文件中以这种格式 (word:defn) 打印一堆带有定义的单词。但是,在服务器上使用 gcc 运行程序时,我遇到了段错误。奇怪的是,当我在本地桌面上编译 C 程序时,程序运行完美。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int read_dict() {
FILE *fp;
int c;
char word[50];
char defn[500];
int sep = 0;
int doublenew = 0;
int i = 0;

fp = fopen("textfile.txt", "r");
if (fp == NULL) {
perror("Error in opening file");
return (-1);
}

while ((c = fgetc(fp)) != EOF) {
if (feof(fp)) {
break;
}
if (c == '.' && sep == 0) {
sep = 1;
word[i] = '\0';
//c = fgetc(fp);
i = 0;
} else
if (doublenew == 1 && c == '\n' && sep == 1) {
defn[i] = c;
i++;
defn[i] = '\0';
printf("%s %s", word, defn);
i = 0;
sep = 0;
doublenew = 0;
} else
if (c == '\n' && sep == 1) {
defn[i] = c;
doublenew = 1;
i++;
} else
if (sep == 0) {
word[i] = c;
i++;
} else
if (sep == 1) {
defn[i] = c;
i++;
doublenew = 0;
}
}
fclose(fp);
return 0;
}

文本文件:

COOKIE. is a small, flat, sweet, baked good, usually containing flour, eggs, sugar, and either butter, cooking oil or another oil or fat. It may include other ingredients such as raisins, oats, chocolate chips or nuts.

ICE CREAM. is a sweetened frozen food typically eaten as a snack or dessert.

最佳答案

单词长度限制为 49 个字符,定义限制为 499 个字符,但您永远不会在代码中检查溢出。如果与您的示例不同,服务器上使用的词典有更长的单词和/或定义,您的代码将调用未定义的行为,这可能会导致段错误。

未定义的行为也可能不会造成任何可见的影响,就像您本地机器上的情况一样。由于版本不同或命令行选项不同,本地编译器生成的代码可能与服务器生成的代码不同。

检查数组边界以避免这种情况:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int read_dict() {
FILE *fp;
int c;
char word[50];
char defn[500];
int sep = 0;
int doublenew = 0;
size_t i = 0;

fp = fopen("textfile.txt", "r");
if (fp == NULL) {
perror("Error in opening file");
return (-1);
}

while ((c = fgetc(fp)) != EOF) {
if (feof(fp)) {
break;
}
if (c == '\r') {
/* ignore CR characters inserted by Windows before LF */
continue;
}
if (c == '.' && sep == 0) {
sep = 1;
word[i] = '\0';
//c = fgetc(fp);
i = 0;
} else
if (doublenew == 1 && c == '\n' && sep == 1) {
if (i < sizeof(defn) - 1) {
defn[i] = c;
i++;
}
defn[i] = '\0';
printf("%s %s", word, defn);
i = 0;
sep = 0;
doublenew = 0;
} else
if (c == '\n' && sep == 1) {
if (i < sizeof(defn) - 1) {
defn[i] = c;
i++;
}
doublenew = 1;
} else
if (sep == 0) {
if (i < sizeof(word) - 1) {
word[i] = c;
i++;
}
} else
if (sep == 1) {
if (i < sizeof(defn) - 1) {
defn[i] = c;
i++;
}
doublenew = 0;
}
}
fclose(fp);
return 0;
}

注意:如果服务器上没有打印任何内容,则表示该文件没有连续的 2 个换行符 '\n'。如果您在系统和服务器上使用相同的文件,并且如果您在系统上使用 Windows 而在服务器上使用 Linux,则您的程序在 '\r' 上的行为会有所不同> Windows 用于行尾的字符。您必须显式忽略这些字符,因为它们只会在 Windows 上被隐式忽略,而不会在 Linux 上被忽略。我修改了上面的代码以解决这个问题。

关于c - 读取文本文件时C程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40552483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com