Строки и символы с printf
Я был смущен использованием %c
и %s
в следующей программе C
#include<stdio.h>
void main()
{
char name[]="siva";
printf("%sn",name);
printf("%cn",*name);
}
выход
siva
s
почему нам нужно использовать указатель для отображения символа %c, а указатель не нужен для строки
Я получаю ошибку, когда я использую
printf("%cn", name);
ошибки у меня есть
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
5 ответов
Если вы попробуете это:
#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 '' ---> This is the NULL termination of the string
для печати символа необходимо передать значение символа в printf. На значение можно ссылаться как name[0] или * name (так как для имени массива = &name[0]).
чтобы напечатать строку, вам нужно передать указатель на строку для printf (в данном случае 'name' или '&name[0]').
%c
предназначен для одного символа char, поэтому он печатает только один элемент.Передавая массив символов в качестве указателя, вы передаете адрес первого элемента массива (то есть одного символа), а затем будет напечатано :
s
printf("%c\n",*name++);
печати
Я
и так далее ...
указатель не нужен для %s, поскольку он может работать непосредственно со строкой символов.
вы путаете оператор разыменования * с аннотацией типа указателя *. В принципе, в C * означает разные вещи в разных местах:
- в типе * означает указатель. int-это целочисленный тип, int* - указатель на целочисленный тип
- как оператор префикса, * означает "разыменование". name-указатель, *name-результат разыменования (т. е. получение значения, на которое указывает указатель)
- конечно, как оператор infix, * означает "умножить".
имя массива - это адрес его первого элемента, поэтому name
is указатель на память, содержащую строку "siva".
также вам не нужен указатель для отображения символа; вы просто решили использовать его непосредственно из массива в этом случае. Вместо этого вы можете сделать следующее:
char c = *name;
printf("%c\n", c);
Если вы хотите отобразить один символ, то вы также можете использовать name[0]
вместо использования указателя.
он будет служить вашей цели, но если вы хотите отобразить полную строку с помощью %c
, вы можете попробовать это:
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}