我正在尝试制作一个程序,提示您选择1或2。1是制作文件,2是追加文件。每当我用if运行if (opt == 1)的代码时,它都会跳过询问文件名的提示符。我希望我说得很清楚,你能理解我的问题。
预期输出——
输入文件名:(input)
输入文件内容:(input)
实际产出——
输入文件名:输入文件内容:(input)
#include <stdio.h>
int main(void) {
char fname[20];
char fcontents[250];
int opt;
printf("Make a file(1),Append a file(2)");
scanf("%d", &opt);
if (opt == 1)
{
printf("Enter a file name: ");
fgets(fname, 20, stdin);
printf("Enter file contents: ");
fgets(fcontents, 250, stdin);
FILE* fpointer = fopen(fname, "w");
fprintf(fpointer, "%s", fcontents);
fclose(fpointer);
printf("FILE: %s successfully created", fname);
}
else if (opt == 2)
{
printf("Enter a file name: ");
fgets(fname, 20, stdin);
printf("Enter file appends: ");
fgets(fcontents, 250, stdin);
FILE* fpointer = fopen(fname, "a");
fprintf(fpointer, "%s", fcontents);
fclose(fpointer);
printf("FILE: %s successfully created", fname);
}
}
scanf
调用后
scanf("%d", &opt);
输入缓冲区包含新的行字符'n'
,对应于按下的回车键。
所以fgets
的下一次调用读取一个包含这个新行字符的空字符串。
解决这个问题的一个简单方法是使用函数scanf
代替fgets
,例如
scanf( " %19[^n]", fname );
如果文件名不能包含空格,那么写
会更简单scanf( "%19s", fname );
要读取文件中存储的内容,最好写入
scanf( " %249[^n], fcontents );
注意格式字符串中的前导空格。它允许跳过空白字符。
另一种方法是到处使用fgets
函数。
要获取变量opt
的值,您可以在本例中使用atoi
或strtol
函数将字符串转换为整数。
请记住,函数fgets
也可以用新的行字符附加读字符串,您应该至少在变量fname
中删除该行字符。要做到这一点,你需要包括标题<string.h>
,并写入例如
fgets( fname, sizeof( fname ), stdin );
fname[ strcspn( fname, "n" ) ] = ' ';
在scanf()
函数之后尝试使用getchar()
int opt;
printf("Make a file(1),Append a file(2)");
scanf("%d", &opt);
getchar();