0

所以我试图在一个新的行上获取每个单词的文本文件中的行数。到目前为止我有这个方法......

char * getS(char *fileName){
    FILE *src;
    if((src = fopen(fileName, "r")) == NULL){
        printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
        exit(-1);
    }
    char *get = ".";        

    int c = 0;
    char ch = 'x';
    while(ch!=EOF) {
        ch = fgetc(src);
        if(ch == '\n')  c++;
    }
    fseek(src, 0, SEEK_SET);
    printf("%i",c);
    int random = rand() % (c - 1);
    return get;
}

出于某种原因,如果我在中间放了一个 ch 的 printf,它会给我正确的行数,否则它是 7801729。

另外,我将如何制作一个从 0 到行数的随机整数?在 C 中使用 random 的概念现在让我很困惑。

提前致谢!

4

1 回答 1

2

我认为 fgetc() 返回一个 int 但您将返回的值填充到一个 char 中(而不将其转换为 char),因此您将返回的 int 的第一个字节放在正确的位置(在您的 ch 变量中)但是额外的三个字节溢出到您的 c 变量中,该变量在堆栈上与 ch 相邻定义。当您增加 c 时,它会增加第一个字节(这表明您在大端机器上),但是 int 中额外的三个字节不会受到影响,并且会因 getc() 返回的覆盖而损坏。这就是您答案中的第一个字节看起来正确的原因。尝试将 ch 定义为 int ,我敢打赌您的问题会消失(尽管您可能必须添加一些转换以避免编译器错误/警告)。

于 2012-09-25T04:02:37.303 回答