【问题标题】:How to understand the statement of printf(str+9)? [duplicate]如何理解printf(str+9)的语句? [复制]
【发布时间】:2017-06-21 11:58:09
【问题描述】:
#include<stdio.h>

void main()
{
char *str="CQUESTIONBANK";
clrscr();
printf(str+9);
getch();
}

输出为 BANK。 printf 语句的作用。谁能解释一下?

【问题讨论】:

  • 指针算法。将字符串移动 9 个字节。
  • str+9 将指针移动到字符串的第 9 个字符。如果您执行str+0,则打印完整的字符串 CQUESTIONBANK。如果你这样做 str+1 只有 QUESTIONBANK 会被打印出来。
  • 卸载 Turbo C,然后得到一本不错的关于 C 的书。
  • @Lundin clrscr(); 把他送走了,对吧? :)
  • ...和void main()

标签: c


【解决方案1】:

C 中的 string 定义为由'\0' 终止的char 序列。字符串不是 C 中的类型。因此,处理字符串的函数接受指向字符串开头的指针(指向 char 的指针)。

您可以对指针进行算术运算。 + x 表示将指针增加x 指向的元素。因此,您的示例中的str+9 指向字符B。该指针作为字符串的开头传递给printf()

【讨论】:

    【解决方案2】:

    str 给出指向字符串的指针的基地址。 所以通常如果你只使用printf(str) 它应该输出CQUESTIONBANK。 但在这种情况下,您正在打印 str+9,即。 printf(str+9),所以在这种情况下,它指的是从第 9 个索引开始的字符串。在这种情况下,第 9 个索引是 B,(C 跟随 0 索引),所以打印的字符串是 BANK。

    printf 将始终打印从传递的指针作为起始位置到字符串结尾的字符串,该字符串存储为'\0',称为空字符。如果你尝试printf(str[13]),它应该打印'\0'

    【讨论】:

      【解决方案3】:
      #include<stdio.h>
      
      void main()
      {
      char *str="CQUESTIONBANK";
      
      /* clrscr() function will clear the console.*/
      clrscr();
      
      /* printf() function, outputs the data. The name of the string, in your case
         it is 'str' always points first element of the string which is 'C'. Adding 9 will
         'str' point to 'B' character in the string. That's why printf is printing from B on wards.
         Similarly adding 10 to 'str' will print from 'A' and so on.*/
      
      printf(str+9);
      
      /* getch() function waits for you to enter any character.*/
      getch();
      }
      

      【讨论】:

      • 谢谢大家...谁让我明白这一点...现在我明白了
      【解决方案4】:

      str 指向一个位置(地址)。您可以使用+- 在这些地址上向任何方向移动。所以,如果str 指向某个地址,比如0x1002,那么str+1 指向0x1003str-1 指向0x1001。 (假设 strchar*。对于其他指针类型,您会以更大的步幅移动 - sizeof(*str)

      在您的示例中 - str 指向一个包含 CQUESTIONBANK 的地址,因此如果您将指针向前移动 9 步,您将越过 C,Q,U,E,S,T,I,O,N,您现在指向 BANK。现在使用 printf 将从该位置打印,导致 BANK

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多