【问题标题】:Why doesn't scanf need an ampersand for strings and also works fine in printf (in C)?为什么 scanf 不需要字符串的&符号并且在 printf (在 C 中)中也可以正常工作?
【发布时间】:2010-12-28 06:14:03
【问题描述】:

我现在正在学习 C 中的字符串。

怎么用scanf来获取你可以做的字符串

scanf("%s",str1);

对于 printf 你可以做

printf("The string is %s\n", str1);

我知道对于scanf,这是因为字符串只是一个字符数组,它是一个指针,但是对于printf,你怎么可以像输入int或float一样输入变量名?

【问题讨论】:

    标签: c string pointers printf scanf


    【解决方案1】:

    scanf 需要读取变量的地址,并且字符串缓冲区已经表示为地址(指向内存中某个位置的指针,或者分解为指针的数组)。

    printf 做同样的事情,将%s 视为指向字符串的指针。

    【讨论】:

      【解决方案2】:

      在 C 中,作为数组的变量在用作函数参数时会变成指向数组第一个元素的指针——因此您的 scanf() 会看到指向内存的指针(假设“str1”是一个数组)。

      在您的 printf() 中,“str1”可以是指向字符串或字符数组的指针(在这种情况下,printf() 看到的参数将是指向数组第一个元素的指针)。

      【讨论】:

      • 更准确地说,在大多数但不是所有上下文中,数组类型的表达式被隐式转换(“衰减”)为指向数组第一个元素的指针。函数参数恰好是发生转换的上下文之一。
      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多