我发生了一个奇怪的问题。在下面给出的代码中,搜索单词" hell"在input.txt(内容是:hell,hellow,hello,hel)中,它打印出我在output.txt中的单词:hell,hellow,hello,这是我的最终任务但是只有当我使用visual studio 2012编译器时。代码是可运行的和可执行的但是我不能在简单的开发人员提示符上运行它,它甚至无法编译。这是为什么?这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ( int argc, char **argv)
{ //find ... -i ... -o ...
char *word;
word = new char;
FILE *readf = fopen ( argv[3] , "r" );
FILE *writef = fopen ( argv[5] , "w" );
while( ( fscanf(readf, "%s", word)!=EOF) )
{
if(strstr(word, argv[1]) != NULL)
{
fprintf(writef,"%s\n",word);
}
}
fclose(readf);
fclose(writef);
return 0;
}
这里的代码运行良好,它编译,执行,但它崩溃并且什么都不做:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ( int argc, char **argv)
{ //find ... -i ... -o ...
char *word = malloc(1024);
FILE *readf = fopen ( argv[3] , "r" );
FILE *writef = fopen ( argv[5] , "w" );
while( ( fscanf(readf, "%s", word)!=EOF) )
{
if(strstr(word, argv[1]) != NULL)
{
fprintf(writef,"%s\n", word);
}
}
fclose(readf);
fclose(writef);
return 0;
}
答案 0 :(得分:1)
主要问题是运算符new
只能在C ++中找到,而不是C。
由于只使用C头文件,并且正在通过fscanf()
和fprintf()
执行I / O,因此这是C代码而不是C ++。
这只是表明visual studio
有很多不足之处。
注意:
1)在检查argv[]
以确保所需命令行参数确实存在之前,永远不应在argv[0]
之后访问argc
数组。
因为如果用户没有输入适当数量的命令行参数,程序将因seg事件而崩溃。
如果未输入正确数量的命令行参数,程序应输出USAGE消息,类似于:
fprintf( stderr, "USAGE: %s <parm1> <parm2> ...\n", argv[0]);
2)使用fscanf()
进行循环控制的正确方法是检查预期的返回值(=格式说明符的数量)I.E。
while( 1 == fscanf(readf, "%s", word) )
此外,&#39;%s&#39;格式说明符将允许用户溢出输入缓冲区。强烈建议这些修改
char word[100]
// eliminate this line: word = new char;
while( 1 == fscanf(readf, "%99s", word) )
3)调用函数fopen()
时,始终检查(!= NULL)返回的值以确保操作成功。类似于:
FILE *readf = NULL;
if( NULL == (readf = fopen ( argv[3] , "r" ) ) )
{ // then fopen failed
perror( "fopen for input file failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen for read successful
FILE *writef = NULL;
if( NULL == (readf = fopen ( argv[5] , "w" ) ) )
{ // then fopen failed
perror( "fopen for output file failed" );
fclose( readf ); // cleanup
exit( EXIT_FAILURE );
}
// implied else, fopen for write successful
但是,上述对perror()
的调用可以替换为fprintf()
的调用,类似于:
fprint( stderr, "fopen for read of %s failed due to: %s\n", argv[3], strerror( errno ) );