C 为什么向%s提供指针参数无效?
当我写C 为什么向%s提供指针参数无效?,c,pointers,printf,format-specifiers,C,Pointers,Printf,Format Specifiers,当我写 #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);
#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);
}
我认为它会起作用,因为我把char name[50]
的地址放在指针值中,但它不起作用
所以我把代码改为
(printf("FileName>> %s\n", *ptr);
它工作得很好,但我不理解逻辑;DR-ptr
是指针,*ptr
不是指针
就你的情况来说
printf("FileName>> %s\n", ptr);
工作正常,因为%s
格式说明符需要一个指向字符串的指针作为参数。ptr
的类型是char*
。所以,这很好
参考C11
标准,第§7.21.6.1章,fprintf功能(重点)
s
如果不存在
l
长度修饰符,则参数应为指向初始值的指针
字符类型数组的元素[…]
奥托
不起作用,因为,*ptr
将为您提供一个char
,它不是%s
格式说明符的预期参数类型。为任何特定格式说明符使用不匹配的参数类型将调用
也就是说,至少应将void main()
更改为int main(void)
,以符合标准。printf(“文件名>>%s\n”,ptr)
之所以有效,是因为printf
要求%s
说明符使用char*
类型的参数。相反,*ptr
的类型为char
,因此在这种情况下无法工作
按照相同的逻辑,ptr=&name代码>语句有错误。实际上,name
已经是char*
类型的指针,指向name[10]
数组的第一个元素,而&name
的类型是char**
我认为您应该花一些时间仔细调试代码,否则将很难理解多个错误以神秘方式交互的影响。嗯..%s需要指针值的类型(地址,而不是内存)我是否很理解???@KIM我认为你是对的。您不需要取消对指针的引用。指针是地址。printf/scanf需要一个有效的内存地址。所以把一个传给它,就这么简单。例如scanf(“%s”和&name)
将不起作用,因为它意味着“给出指针本身存储的地址,然后尝试在那里存储整个字符串”。除了答案之外,ptr=&name
只需在makeFile
函数中更改本地参数的值。它不会更改从main
传递的ptr
的值。即使是这样,当返回到main
时,&name
的值也不再有效。
printf("FileName>> %s\n", ptr);
printf("FileName>> %s\n", *ptr);