0

我是一名高级 Comp Sci 专业,即将进入我的最后一个学期,在那里我将只参加一门只涉及语言 C 的课程。我试图通过制作一个我构思的相当简单的程序来练习我的技能。我只是想读取一个文件,将其全部内容放入一个数组中,然后遍历这个数组寻找一个拼写出来的字符序列"Waldo"。换句话说,一种沃尔多在哪里?程序。

我还没有开始使用数组对“Waldo”搜索进行编码,但相反,我只是想测试我对getc()函数的使用并输出输入文件的内容,但到目前为止,我只收到了源代码看似乱码的错误输出(可能与我错误地使用getc()返回值的方式有关)。

也许我不应该使用getc()而是使用scanf()类型函数?此外,在此处插入和打印出数组时,我非常想掌握按引用指针表示法,所以我想避免使用括号表示法(按值)引用数组元素。诚然,我可能对指针没有最完整的理解。

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

void main( int argc, char *argv[] )
{

    FILE *filePointer;
    int filechar, i; 
    char input_file_array[512];
    char *arrayPointer = input_file_array;
    filePointer = fopen( argv[1], "r" );

    if ( argc > 2 || ( filePointer = fopen( argv[1], "r" ) ) == NULL )
    {
        printf( "\nIncorrect usage, please say...\nRunWaldo *filename*\n\n" );
        exit( 1 );
    }

    if ( filePointer != NULL )
    {    
        while ( !feof( filePointer ) )
        {
            *arrayPointer = getc( filePointer );
            arrayPointer++;
        }

    for ( i = 0; i < 512; i++ )
    {
        printf( "%c", *(arrayPointer + i) );
    }

    printf("\n");

}

这是输出...

4

2 回答 2

1

您的代码中的主要问题实际上是您如何打印出input_file_array. 假设您正在从文件中读取 10 个字符。arrayPointer现在从 的原始位置偏移 10 input_file_array。之后,您不会重置arrayPointerinput_file_array[0].

所以它开始打印input_file_array[10]。当你输出时,一个更大的问题会发生,input_file_array[512+10]因为你已经正式越界并且会发生一些时髦的事情。你应该做的是:

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

void main( int argc, char *argv[] )
{

    FILE *filePointer;
    int filechar, i; 
    char input_file_array[512];
    char *arrayPointer = input_file_array;
    filePointer = fopen( argv[1], "r" );

    if ( argc > 2 || ( filePointer = fopen( argv[1], "r" ) ) == NULL )
    {
        printf( "\nIncorrect usage, please say...\nRunWaldo *filename*\n\n" );
        exit( 1 );
    }

    if ( filePointer != NULL )
    {    
        while ( !feof( filePointer ) )
        {
            *arrayPointer = getc( filePointer );
            arrayPointer++;
        }
    }

    arrayPointer = input_file_array; // or you can just output input_file_array[i] instead
    for ( i = 0; i < 512; i++ )
    {
        printf( "%c", *(arrayPointer + i) );
    }

    printf("\n");

}
于 2020-06-03T00:19:58.403 回答
0

这是OG发布的第二个问题。在输出末尾得到垃圾的原因是因为 input_file_array 的最后一个字符不是 0(NULL 值)。这发生在两种情况下:

一个是编译器(我不知道为什么)允许输入数组之后的一些垃圾值泄漏。我建议让 input_file_array 的大小为 513,而 input_file_array[512] 始终等于 0。这样,你永远不会需要处理垃圾。

另一种情况是因为您的数组当前未初始化。如果您读取的字符少于 512 个,其余的仍然是随机值,在输出时显示为垃圾。字符串的一个好的经验法则是在开始时将数组 memset 为 0。另一种方法是在最后一次阅读后将 0 添加到元素上。

于 2020-06-04T15:14:20.250 回答