我是一名大四的计算机科学专业的学生,即将进入我的最后一个学期,在这个学期里,我将只学习一门只涉及C语言的课程。我试图通过制作一个我构思的相当简单的程序来练习我的技能。我只是想读取一个文件,把它的全部内容放到一个数组中,然后遍历这个数组,寻找一个能拼写出的字符序列。"Waldo"
. 换句话说,就是一种 "Where's Waldo?"的程序。
我还没有对 "Waldo "搜索的数组进行编码,但我只是想测试一下我在使用 getc()
函数并输出输入文件的内容,但到目前为止,我所拥有的源代码,只接收到一些看似胡言乱语的错误输出(可能与我错误地利用了 getc()
返回值)。)
也许我不应该使用 getc()
而不是使用 scanf()
类型的函数? 另外,我非常想在这里插入数组并打印出数组时掌握by-reference指针符号,所以我希望避免使用括号符号(by-value)来引用数组元素。 诚然如此,我对指针的理解可能不是最全面的。
#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");
}
你的代码中主要的问题其实是你如何打印出来的。input_file_array
. 想象一下,你从文件中读取10个字符。arrayPointer
的原始位置偏移了10个字符。input_file_array
. 之后,你不重置 arrayPointer
回到 input_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");
}
这是对OG发布的第二个问题的回答. 为什么你在输出的最后得到垃圾,是因为你的input_file_array的最后一个字符不是0(NULL值)。这种情况发生在两种情况下。
一种是编译器(我不知道为什么)允许输入数组后的一些垃圾值泄漏进来。我建议让 input_file_array 的大小为 513,而 input_file_array[512] 总是等于 0,这样你就不需要处理垃圾值了。
另一种情况是因为你的数组目前还没有被初始化。如果你读取的字符数少于512个,那么剩下的还是随机值,在输出时就会显示为垃圾。对于字符串来说,一个好的经验法则是在开始的时候将数组的memset为0。另一种方法是在最后一次读取后将0加到元素上。