【问题标题】:Having trouble regarding output of a printf statement在输出 printf 语句时遇到问题
【发布时间】:2019-11-13 07:28:09
【问题描述】:

我无法理解以下代码 sn-p 的输出。

#include<stdio.h>
int main()
{
    char *str;
    str = "%d\n";
    str++;
    str++;
    printf(str-2, 300);
    return 0;
}

代码的输出是300。

我了解直到printf 语句之前的行,str 指向字符-%。我需要帮助的是了解为什么 printf 函数打印 300。

【问题讨论】:

  • 不,在printf 语句str 指向换行符之前。
  • 我不确定你在做什么:printf(str-2, 300); 但是,第一个参数应该是格式字符串。第二个和后面的参数是提供给格式字符串中的输出格式说明符的值。但是,为格式字符串引用某些变量被认为存在安全风险

标签: c printf pointer-arithmetic post-increment


【解决方案1】:

2 - 2 等于 0.:)

其实就是这两个表达式语句

str++;
str++;

可以像这样重写

str = str + 1;
str = str + 1;

相当于一个语句

str = str + 2;

然后在语句中用 printf

printf(str-2, 300);

您正在使用表达式str-2 指向字符串文字"%d\n" 的第一个字符,或者表达式str-2 的值等于str 的原始值。

(你还记得2 - 2 == 0吗?)

所以上面的语句等价于

printf(str, 300);

str 最初由字符串文字 "%d\n" 初始化时

【讨论】:

    【解决方案2】:

    printf 之前,str不是指向%,而是指向\n

    ++ 运算符递增str 的值以指向数组中的下一个字符。由于这样做了两次,它指向\n。然后,当您将str-2 传递给printf 时,它会创建一个指向% 的指针。所以printf 看到字符串"%d\n" 会导致按预期打印 300。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2010-12-28
      • 2023-03-04
      相关资源
      最近更新 更多