为什么向%s提供指针参数不起作用?

时间:2016-01-11 12:32:53

标签: 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);
    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);

它运作良好,但我不理解逻辑。

2 个答案:

答案 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)以符合标准。