【问题标题】:Strings and character with printf使用 printf 的字符串和字符
【发布时间】:2011-12-22 14:34:04
【问题描述】:

我对以下 C 程序中 %c%s 的使用感到困惑

#include <stdio.h>
    
void main()
{
    char name[]="siva";
    printf("%s\n",name);
    printf("%c\n",*name);
}

输出是

siva
s

为什么我们需要使用指针来显示字符%c,而字符串不需要指针

我在使用时遇到错误

printf("%c\n", name);

我得到的错误是

str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’

【问题讨论】:

    标签: c printf


    【解决方案1】:

    如果你试试这个:

    #include<stdio.h>
    
    void main()
    {
     char name[]="siva";
     printf("name = %p\n", name);
     printf("&name[0] = %p\n", &name[0]);
     printf("name printed as %%s is %s\n",name);
     printf("*name = %c\n",*name);
     printf("name[0] = %c\n", name[0]);
    }
    

    输出是:

    name = 0xbff5391b  
    &name[0] = 0xbff5391b
    name printed as %s is siva
    *name = s
    name[0] = s
    

    所以'name'实际上是一个指向内存中字符数组的指针。如果你尝试读取 0xbff5391b 的前四个字节,你会看到 's'、'i'、'v' 和 'a'

    Location     Data
    =========   ======
    
    0xbff5391b    0x73  's'  ---> name[0]
    0xbff5391c    0x69  'i'  ---> name[1]
    0xbff5391d    0x76  'v'  ---> name[2]
    0xbff5391e    0x61  'a'  ---> name[3]
    0xbff5391f    0x00  '\0' ---> This is the NULL termination of the string
    

    要打印一个字符,您需要将字符的值传递给 printf。该值可以作为 name[0] 或 *name 引用(因为对于数组 name = &name[0])。

    要打印字符串,您需要将指向字符串的指针传递给 printf(在本例中为 'name' 或 '&name[0]')。

    【讨论】:

      【解决方案2】:
      %c
      

      是为单个字符设计的,因此它只打印一个元素。将 char 数组作为指针传递,您将传递数组第一个元素的地址(即单个字符),然后将被打印:

      s

      printf("%c\n",*name++);
      

      将打印

      等等……

      %s 不需要指针,因为它可以直接处理字符串。

      【讨论】:

        【解决方案3】:

        您将取消引用运算符 * 与指针类型注释 * 混淆了。 基本上,在 C * 中,在不同的地方意味着不同的东西:

        • 在类型中,* 表示指针。 int 是整数类型,int* 是指向整数类型的指针
        • 作为前缀运算符,* 表示“取消引用”。 name 是一个指针,*name 是解引用它的结果(即获取指针指向的值)
        • 当然,作为中缀运算符,* 表示“乘”。

        【讨论】:

        • * 在引用指针时,总是意味着同样的事情。你只是想多了(聪明的标志)。这么看,int *myintptr; 表示指针myintptr 所引用的地址将存储一个int,而*myintptr = 5; 表示指针myintptr 所引用的地址应该包含一个5。@ 987654327@ 始终表示“值”。
        【解决方案4】:

        数组的名称是它的第一个元素的地址,所以name 一个包含字符串“siva”的内存指针。

        你也不需要指针来显示字符;在这种情况下,您只是选择直接从数组中使用它。你可以这样做:

        char c = *name;
        printf("%c\n", c);
        

        【讨论】:

        • 更重要的是*namederefencing指针(即返回指针指向的东西)
        【解决方案5】:

        如果要显示单个字符,也可以使用name[0],而不是使用指针。

        这将满足您的目的,但如果您想使用 %c 显示完整的字符串,您可以试试这个:

        #include<stdio.h>
        void main()
        { 
            char name[]="siva";
            int i;
            for(i=0;i<4;i++)
            {
                printf("%c",*(name+i));
            }
        } 
        

        【讨论】:

          【解决方案6】:

          问题是 printf 函数需要一个指针作为参数。但是,char 是您可以直接访问的变量。字符串是字符串第一个字符上的指针,因此您不必添加 *,因为 * 是变量指针的标识符。

          【讨论】:

          • 欢迎来到 StackOverflow!这个问题已有好几年的历史了,并且有很多解释清楚,详细的答案。目前,您的答案并没有比这些其他答案添加更多内容。如果您能够提供更多详细信息并为问题添加一些新方面,请编辑您的帖子并将其包含在内。如果你不能,别担心!这个网站上还有很多其他问题;继续并删除此答案并尝试解决最近的问题。回答愉快!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-31
          • 2017-03-18
          • 2016-09-01
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多