我在发布之前查看了一些“FGETS”问题,我收集的是它可能是一个新行字符导致手动输入问题。
int main ( int argc, char *argv[] ){
char temp[1000];
FILE *user_file;
printf("Starting....\n"); //Used for user visual.
if(argc == 2){ //open file
user_file = fopen(argv[1],"r");
if( user_file == NULL ){
printf("No file was found.");
exit(2);
}else{
fgets(temp,strlen(temp),user_file);
}
}else if( argc > 2 ){ // Will exit if arguments are greater than 2.
printf("Maximum args 2.\n");
exit(1);
}else{
printf("File was not provided, please enter the text to convert.\n"); //If the user doesnt provide a file allow manual input.
fgets(temp,strlen(temp),stdin);
}
printf("%s\n",temp);
return 0;
}//End main
问题:
为什么fgets没有打开我在cmd行上提供的txt文件,并将其存储到临时数组?
如果未提供该文件,为什么在“else”语句中跳过Fgets?
答案 0 :(得分:0)
数组temp[]
未初始化,您尝试查找strlen(temp)
。你甚至不知道数组中是否存有NUL
。尝试做:
#define MAXLINE 1000
并将您的来电更改为fgets()
:
fgets(temp, MAXLINE, user_file);
...
fgets(temp, MAXLINE, stdin);
答案 1 :(得分:0)
您的代码存在多个问题。
这是第一个问题:
char temp[1000];
您的缓冲区声明不会初始化缓冲区的内容 - 因此每个char值的值将是之前原始内存中的值。在C语言中,大多数字符串都是“空终止”,因此终止NULL
(0
- 零)很重要,否则可能会遇到缓冲区溢出。
“最佳”方法是在使用之前将数组/缓冲区清零(零初始化),就像这样(在C99中):
char temp[1000] = {0};
...这种方式temp
将包含所有0
值(NULL
),因此写入它的任何内容(假设它不超过999字节)将自动具有空终止符(虽然fgets
将附加一个终止0
值,但不是C中的每个函数都会这样做。)
第二个问题与第一个问题有关:您正在使用运行时字符串长度函数strlen
来获取strlen
缓冲区的大小。这是不正确的,因为缓冲区大小在编译时固定为1000. strlen
将返回第一个0
(NULL
)char值的索引,这是未定义的行为因为你还没有对缓冲区进行零初始化(所以如果缓冲区的原始原始数据包含零,它可以立即返回0
,或者因为从来没有任何零值,它可能会超出1000。
...因此你需要重新使用缓冲区长度,如下所示:
#define TEMP_LENGTH 1000
char temp[ TEMP_LENGTH ];
...
fgets( temp, TEMP_LENGTH, user_file );
最后,当你致电fgets( temp, ..., stdin )
时,你犯了同样的错误。
答案 2 :(得分:0)
这里的问题出现在您的代码中,而不是在传递strlen(temp)的第二个参数中传递数值。
fgets(temp,strlen(temp),user_file);
正确的方法是: -
fgets(temp,1000,user_file);