#define _CRT_SECURE_NO_WARNINGS
#include "header.h"
void main() {
int input;
FILE* of = NULL;
FILE* rf = NULL;
char* ptr = NULL;
while (1) {
printf("1.writeFile\n2.ReadFile\n3.removeFile\n4.exit\n>>");
scanf("%d", &input);
switch (input) {
case 1:
makeFile(of, ptr);
break;
case 2:
readFile(rf);
break;
case 3:
deleteFile();
break;
case 4:
exit(1);
}
}
}
void makeFile(FILE* of, char* ptr) {
char name[10];
char str[50];
printf("Input file name >>");
scanf("%s", &name);
ptr = &name;
of = fopen(name, "w");
printf("FileName>> %s\n", *ptr);
printf("input text >>");
scanf("%s", str);
fputs(str, of);
}
我写的时候
(printf("FileName>> %s\n", *ptr);
我认为它会起作用,因为我将char name[50]
的地址放入指针值,但是,它不起作用。
所以我将代码更改为
printf("FileName>> %s\n", ptr);
它运作良好,但我不理解逻辑。
答案 0 :(得分:1)
printf("FileName>> %s\n", ptr);
有效,因为printf
期望char *
说明符的类型为%s
的参数。相反,*ptr
的类型为char
,因此在这种情况下无效。
按照相同的逻辑,ptr = &name;
语句有问题。实际上,name
已经是char *
类型的指针,指向name[10]
数组的第一个元素,而&name
的类型为char **
我认为你应该花一些时间仔细调试代码,否则很难理解多个错误以神秘方式交互的影响。
答案 1 :(得分:0)
TL; DR - ptr
是一个指针,*ptr
不是。
在您的情况下,详细说明
printf("FileName>> %s\n", ptr);
有效,因为%s
格式说明符需要指向字符串的指针作为参数。 ptr
的类型为char *
。所以,没关系。
参考C11
标准,章节§7.21.6.1, fprintf函数(强调我的)
s
如果不存在l
长度修饰符,则参数应为指向初始值的指针 字符类型数组的元素。[...]
OTOH,
printf("FileName>> %s\n", *ptr);
不起作用,因为*ptr
会给你一个char
,它不是%s
格式说明符的预期参数类型。对任何特定格式说明符使用不匹配的参数类型会调用undefined behavior。
也就是说,您应该至少将void main()
更改为int main(void)
以符合标准。