在fgetc while循环中的Segfault

时间:2018-03-09 01:35:39

标签: c

我正在写这个代码有点麻烦。我能够在其他地方编译它,但是当我尝试在我的机器上编译时,我遇到了一个段错误。

以下是我收到的错误消息:

0x0000000000400dc6 in readFile (keyFileDir=0x401014 "k1.txt", 
plainTextFileDir=0x40101b "p1a.txt") at main.c:172
172                             key[j++] = tolower((char) i);

以下是代码:

FILE *keyFile;
FILE *plainTextFile;

keyFile = fopen(keyFileDir, "r");
plainTextFile = fopen(plainTextFileDir, "r");

fprintf(stdout, "\n\n");

if (keyFile == NULL) {
    fprintf(
        stderr,
        "%s file not found, therefore we have no key.\n",
        keyFileDir);
    exit(0);
}
if (plainTextFile == NULL) {
    fprintf(
        stderr,
        "%s file not found, therefore we have no plaintext.\n",
        plainTextFileDir);
    exit(0);
}

char *key, *plaintext;
int i, j, k, l = 0;

key = malloc(sizeof(char) * 10000);
plaintext = malloc(sizeof(char) * 10000);

while ((i = fgetc(keyFile)) != EOF) {
    if (i != ' ') {
        if ((i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) {
            key[j++] = tolower((char)i);
        }
    }
}

key[j] = '\0';

while ((k = fgetc(plainTextFile)) != EOF) {
    if (k != ' ') {
        if ((k >= 'a' && k <= 'z') || (k >= 'A' && k <= 'Z')) {
            plaintext[l++] = tolower((char)k);
        }
    }
}

plaintext[l] = '\0';

作为参考,我正在喂食字符串&#34; k1.txt&#34;和&#34; p1a.txt&#34;作为参数。我对C很新,所以我相信这是一个简单的问题。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你可能假设int i, j, k, l = 0;将所有这些都初始化为0;但它没有 - 只有l被初始化 你需要写int i=0, j=0, k=0, l = 0;

因此,您的j是一个随机值,而k[j] =是您在随机的内存位置写的,这是未定义的行为=崩溃。

答案 1 :(得分:0)

除了@Aganju所说的(你可能很幸运,价值可能会从0开始(例如,在我的C日,例如在Sun Solaris上),还有一个事实是你永远不会限制你的循环缓冲区的大小,如果您读取的文件大于10000字节缓冲区,则可能会遇到内存问题。