C fscanf意外地从下一行提取内容

C fscanf意外地从下一行提取内容,c,scanf,C,Scanf,编辑:好的,我发现了一个令人尴尬的错误。我的描述数组不够大,无法容纳该行 我试图从一个简单格式化的文本文件中提取相关的缩写和描述,但是我在一行中遇到了一个问题,而每一行都可以正常工作 在我阅读的文本文件中,第5-7行是: 5. FW Foreign word 6. IN Preposition or subordinating conjunction 7. JJ Adjective 我试图对每一行做的是读取缩写并将其存储为字符数组,然后对描述执行相同的操作。对于除#6之外的每一行,它都可以正常

编辑:好的,我发现了一个令人尴尬的错误。我的描述数组不够大,无法容纳该行

我试图从一个简单格式化的文本文件中提取相关的缩写和描述,但是我在一行中遇到了一个问题,而每一行都可以正常工作

在我阅读的文本文件中,第5-7行是:

5. FW Foreign word
6. IN Preposition or subordinating conjunction
7. JJ Adjective
我试图对每一行做的是读取缩写并将其存储为字符数组,然后对描述执行相同的操作。对于除#6之外的每一行,它都可以正常工作

我所期望的是:

print decription[line6]   => "Preposition or subordinating conjunction"
但我得到的是:

print decription[line6]   => "Preposition or subordinating conjunctio"Adjective"
我很不明白它为什么会这样做。它似乎正在从下一行读取数据。或者可能我最终覆盖了数组中的下一行

#include <stdio.h>

int main(){
    FILE *fileToRead = fopen("PennTreebank_POS_Tags.txt", "r");
    FILE *fileToWrite = fopen("newFile.txt", "w");

    int i, j;
    i = j = 0;
    int nextChar;

    char abbreviation[50][5];
    char description[50][40];

    while( fscanf(fileToRead, "%*s %s ", abbreviation[i]) != EOF ){

        description[i][0] = '"';
        while( ((nextChar = fgetc(fileToRead)) != '\n') && (nextChar != EOF) ){
            description[i][j] = nextChar;
            j++;
        }
        description[i][j] = '"';
        description[i][j+1] = '\0';

        j=1;
        i++;
    }

    for( i=0; i<36; i++ ){
        printf("%s %s\n", abbreviation[i], description[i]);
    }
}
#包括
int main(){
FILE*fileToRead=fopen(“penntrebank_POS_Tags.txt”,“r”);
FILE*fileToWrite=fopen(“newFile.txt”、“w”);
int i,j;
i=j=0;
int nextChar;
字符缩写[50][5];
字符说明[50][40];
而(fscanf(fileToRead,“%*s%s”,缩写[i])!=EOF){
说明[i][0]=“”;
而(((nextChar=fgetc(fileToRead))!='\n')&&(nextChar!=EOF)){
说明[i][j]=nextChar;
j++;
}
说明[i][j]=“”;
说明[i][j+1]='\0';
j=1;
i++;
}
对于(i=0;i而言,“介词或从属连词”的长度为40个字符

那么数组呢

char description[50][40];

将没有足够的大小来容纳长度为40加0的终止符。

出于好奇,什么是
posVerbose
,如果有什么关系的话,它与
description
有什么关系?我最初用pos缩写和posVerbose作为缩写和描述。我为帖子更改了它们。我想错过了那篇gardless,您正在构建一个长度超过40个字符的字符串,因此您正在覆盖到下面的缓冲区中。您的
40
将必须更长(在本例中,至少43个字符)。谢谢,我实际上刚刚注意到了这一点,感觉非常愚蠢