【问题标题】:Why supplying a pointer argument to %s does not work?为什么向 %s 提供指针参数不起作用?
【发布时间】:2016-01-11 12:32:53
【问题描述】:
#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);

而且效果很好,但我不明白其中的逻辑。

【问题讨论】:

  • 指针是地址。 printf/scanf 需要一个有效的内存地址。所以传一个给它,就这么简单。 scanf("%s", &name); 之类的东西不起作用,因为它意味着“给出存储指针本身的地址,然后尝试在那里存储整个字符串”。
  • 除了答案之外,ptr = &name; 只是改变了makeFile 函数内部的局部参数的值。它确实更改从main 传递的ptr 的值。即使这样,&name 的值在返回到 main 时也将不再有效。

标签: c pointers printf format-specifiers


【解决方案1】:

printf("FileName>> %s\n", ptr); 有效,因为printf 需要char * 类型的参数作为%s 说明符。相反,*ptr 的类型为 char,因此在这种情况下无法工作。

同样的逻辑,ptr = &name; 语句是错误的。其实name已经是char *类型的指针,指向name[10]数组的第一个元素,而&name的类型是char **

我认为你应该花一些时间仔细调试代码,否则将很难理解多个错误以神秘方式交互的影响。

【讨论】:

    【解决方案2】:

    TL;DR -- ptr 是一个指针,*ptr 不是。


    详细说明,在你的情况下,

    printf("FileName>> %s\n", ptr);
    

    有效,因为%s 格式说明符需要一个指向 string 的指针作为参数。 ptr 的类型是 char *。所以,没关系。

    参考C11 标准,第 §7.21.6.1 章,fprintf 函数强调我的

    s
    如果不存在l 长度修饰符,则参数应为指向初始值的指针 字符类型数组的元素.[...]

    哦,

    printf("FileName>> %s\n", *ptr);
    

    不起作用,因为*ptr 会给你一个char,这不是%s 格式说明符的预期参数类型。对任何特定格式说明符使用不匹配类型的参数会调用 undefined behavior

    也就是说,您至少应该将void main() 更改为int main(void) 以符合标准。

    【讨论】:

    • umm.. %s 需要指针值的类型(地址,而不是内存)我明白吗??
    • @KIM 我认为你是对的。您不需要取消引用指针。
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 2022-01-22
    • 2014-11-26
    • 1970-01-01
    • 2021-01-25
    • 2020-06-22
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多