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);