2011-11-05 12 views
26

Byłem zmieszany z wykorzystaniem %c i %s w następnym programie CStruny i charakter z printf

#include<stdio.h> 

    void main() 
    { 
    char name[]="siva"; 
    printf("%s\n",name); 
    printf("%c\n",*name); 
    } 

Wyjście jest

siva 
s 

Dlaczego musimy użyć wskaźnika do wyświetlania znaku% c i wskaźnik nie jest potrzebny dla ciągu znaków

Otrzymuję błąd, gdy używam

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

Błąd mam to

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

Odpowiedz

42

Jeśli spróbujesz to:

#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]); 
} 

wyjściowa wynosi:

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

Więc 'name' jest rzeczywiście wskaźnik do tablicy znaków w pamięci.Jeśli spróbujesz czytając pierwsze cztery bajty na 0xbff5391b, widać „s”, „i”, „v” i „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 

Aby wydrukować znak trzeba przekazać wartość znaku printf. Wartość może być określana jako nazwa [0] lub * nazwa (od nazwy tablicy = & nazwa [0]).

Aby wydrukować ciąg znaków, należy przekazać wskaźnik do łańcucha znaków do printf (w tym przypadku "nazwa" lub "& nazwa [0]").

4

Nazwa tablicy jest adresem jej pierwszego elementu, więc namejest wskaźnik do pamięci zawierające ciąg „Siva”.

Również nie potrzebujesz wskaźnika do wyświetlania znaku; właśnie wybierasz, aby użyć go bezpośrednio z tablicy w tym przypadku. Zamiast tego można to zrobić:

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

Więcej do punktu '* name' to * derefencing * wskaźnik (czyli powrót rzecz wskaźnik wskazuje) –

6

Mylicie operatora dereferencyjnego * z adnotacją typu wskaźnika *. Zasadniczo w języku C * oznacza różne rzeczy w różnych miejscach:

  • W typie * oznacza wskaźnik. int jest typem całkowitym, int * jest wskaźnikiem na typ liczbowy
  • Jako operator prefiks * oznacza "dereferencję". name jest wskaźnikiem, * nazwa jest wynikiem dereferencji (tzn. uzyskania wartości wskazywanej przez wskaźnik)
  • Oczywiście jako operator infiks * oznacza "mnożenie".
+0

'*' w odniesieniu do wskaźnika, zawsze oznacza to samo. po prostu przemyślacie to (znak inteligencji). spójrz na to w ten sposób, 'int * myintptr;' oznacza, że ​​adres, do którego odwołuje się wskaźnik 'myintptr' zapisze' int', a '* myintptr = 5;' oznacza, że ​​adres, do którego odnosi się wskaźnik 'myintptr' powinien zawierać 5. "*" oznacza zawsze "wartość at". –

8
%c 

jest przeznaczony dla pojedynczego znaku char, więc wydrukować tylko jeden element.Passing tablicę char jako wskaźnik jesteś przechodzącą adres pierwszego elementu tablicy (czyli jeden char), a następnie zostaną wydrukowane:

s

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

wypisze

i

i tak dalej ...

wskaźnik nie jest potrzebny do% s, ponieważ może pracować bezpośrednio z ciągu znaków.

0

Jeśli chcesz wyświetlić pojedynczy znak, możesz również użyć name[0] zamiast wskaźnika.

To będzie służyć swój cel, ale jeśli chcesz, aby wyświetlić pełny ciąg przy użyciu %c, można spróbować to:

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