Строки и символ с printf - PullRequest
       3

Строки и символ с printf

37 голосов
/ 05 ноября 2011

Я был перепутан с использованием %c и %s в следующей программе на C

#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 *’

Ответы [ 5 ]

62 голосов
/ 05 ноября 2011

Если вы попробуете это:

#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

Таким образом, «имя» на самом деле является указателем на массив символов в памяти. Если вы попытаетесь прочитать первые четыре байта в 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 [0]).

Чтобы напечатать строку, вам нужно передать указатель на строку в printf (в данном случае 'name' или '& name [0]').

10 голосов
/ 05 ноября 2011
%c

предназначен для одного символа char, поэтому он печатает только один элемент. Передавая массив char в качестве указателя, вы передаете адрес первого элемента массива (то есть один символ) и затем будете напечатаны :

S

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

напечатает

i

и так далее ...

Указатель не нужен для% s, поскольку он может работать напрямую со строкой символов.

6 голосов
/ 05 ноября 2011

Вы путаете оператор разыменования * с аннотацией типа указателя *. В основном, C * означает разные вещи в разных местах:

  • В типе * означает указатель. int - целочисленный тип, int * - указатель на целочисленный тип
  • В качестве префиксного оператора * означает «разыменование». имя - это указатель, * имя - это результат разыменования (т.е. получения значения, на которое указывает указатель)
  • Конечно, как инфиксный оператор, * означает «умножение».
4 голосов
/ 05 ноября 2011

Имя массива - это адрес его первого элемента, поэтому name - это указатель на память, содержащую строку "siva".

Также вам не нужноуказатель для отображения символа;в этом случае вы просто хотите использовать его непосредственно из массива.Вы можете сделать это вместо:

char c = *name;
printf("%c\n", c);
0 голосов
/ 06 января 2018

Если вы хотите отобразить один символ, вы также можете использовать name[0] вместо указателя.

Это будет служить вашим целям, но если вы хотите отобразить полную строку, используя %c, вы можете попробовать это:

#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...