我正在尝试制作一个程序,提示您选择 1 或 2。1 是制作文件,2 是附加文件。每当我使用 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);
输入缓冲区包含对应于按下的 Enter 键的换行符
'\n'
。
所以下一次调用
fgets
会读取一个包含这个换行符的空字符串。
解决问题的一个简单方法是使用函数
scanf
而不是fgets
,例如
scanf( " %19[^\n]", fname );
如果文件名不能包含空格那么写起来就更简单了
scanf( "%19s", fname );
要读取存储在文件中的内容,最好写
scanf( " %249[^\n], fcontents );
注意格式化字符串中的前导空格。它允许跳过空白字符。
另一种方法是到处使用函数
fgets
.
要获取变量
opt
的值,您可以在这种情况下使用函数 atoi
或 strtol
将字符串转换为整数。