【问题标题】:String and pointer in C [duplicate]C中的字符串和指针[重复]
【发布时间】:2021-08-12 16:33:48
【问题描述】:

指针是存储地址的变量。

char *ptr = "string";
printf("%s",ptr);

在这段代码 sn-p 中,整个字符串在没有取消引用的情况下打印。为什么会这样?

在这种情况下,字符正在打印,它就像一个数组一样按预期工作。

char *ptr = "string";
printf("%c",*ptr);

这两种情况有什么区别

【问题讨论】:

  • 任何关于 C 的介绍性教科书都会解释这一点
  • 是时候阅读 printf 的文档了。它期望 %c 的参数类型是什么,%s 说明符是什么?

标签: arrays c string pointers


【解决方案1】:

格式字符串“%s”期望对应的参数指向字符串的第一个字符,函数printf输出字符串,直到遇到终止零字符'\0'。

其实这个printf的调用

char *ptr = "string";
printf("%s",ptr);

在逻辑上通过以下方式实现

#include <stdio.h>

int main(void) 
{
    char *ptr = "string";

    for ( char *tmp = ptr; *tmp != '\0'; ++tmp )
    {
        printf( "%c", *tmp );
    }
    
    return 0;
}

格式字符串"%c" 需要一个char 类型的对象,而函数printf 将对象输出为一个字符。

【讨论】:

  • “在底层逻辑上是通过以下方式实现的”——不,真的不是。
  • @Alnitak 为什么有趣?:)
  • 因为内部 printf 将使用普通的fputc 调用(或直接将字符写入输出缓冲区)。它绝对不会使用 %c 说明符对 printf 进行递归调用。
  • @Alnitak 逻辑上是一样的。我使用 printf 是因为在问题中也使用 printf 来输出字符。您提到的是与演示的想法没有共同点的实现细节。
  • 在你所写的东西前面“逻辑地”写并不是这样。
【解决方案2】:

格式字符串(%c 或 %s)告诉它如何处理参数。

%s 用于字符串 - 所以遍历打印每个字符的指针,直到它碰到 \0。

%c 只打印一个字符。

【讨论】:

    【解决方案3】:

    当您定义 char *ptr = "string"; 时,您正在定义 string literal,这是一个以空字符结尾的字符序列。

    格式参数%s 打印一个字符串,直到找到\0,而%c 打印一个字符。

    【讨论】:

      【解决方案4】:
      printf("%c", *ptr);
      

      有点误导。为了清楚起见,您希望字符串中有一个字符...

      printf("%c", ptr[0]);
      

      所以对于%c,你取消引用一个字符。

      %s 取消引用指针,将指针增加一个字符,直到到达 \0。

      %s 相当于这样的东西,使用%c:

      void printf_s(char *cp) {
      
          while(*cp)
              printf("%c", *(cp++));
      }
      

      表达式*(cp++) 表示:cp[0], cp[1],...,cp[n]。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2011-05-21
        • 2012-03-22
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        相关资源
        最近更新 更多