2016-09-10 2 views
2

i ont ces deux c code de programmation .Ils sont identiques, sauf pour une étape et en raison de que leur sortie est totalement différente s'il vous plaît aidez-moi pourquoi est-ce qui se passetableau de caractères avec pointeur en c avec% s

main() 
{ 
char ch[10]="123456"; 
char *p; 
int a; 
scanf("%d",&a); 
p=ch+a; 
*p='0'; 
printf("%s",ch); 
} 

output is 
[email protected]:~$ ./a.out 
4 
123406 

Et voici autre ont seulement une légère modification à la ligne [* p = « 0 »]

main() 
{ 
char ch[10]="123456"; 
char *p; 
int a; 
scanf("%d",&a); 
p=ch+a; 
*p=0;  //only change is here rest is same 
printf("%s",ch); 
} 

and output is 
[email protected]:~$ ./a.out 
4 
1234 

s'il vous plaît me hep pourquoi il est dEFFERENT c'est parce que je suis en utilisant% s dans printf ou pour toute autre chose que je ont été portés disparus

+3

''0''! =' 0'. [Vous pouvez trouver ceci utile] (http://www.asciitable.com/) – WhozCraig

+0

Note: 'p = ch + a;' peut potentiellement invoquer UB, si le nombre entré a fait pointer le pointeur en dehors du tableau. –

+0

Imaginons que nous entrions la valeur

Répondre

2

Pour faciliter l'explication, considérons que nous nous en tenons à ASCII values partout.

Dans le premier cas,

*p='0'; 

met la valeur ASCII du '0' (décimal 48) dans la mémoire pointé par p.

En second cas,

*p = 0; 

met la valeur ASCII 0 (décimal 0) lui-même dans la mémoire pointé par p.

Ainsi, dans le premier cas, pour la chaîne fournie comme argument de %s la valeur à l'index donné (4) est 48, ce qui rend impression le littéral 0 et continuer jusqu'à ce qu'il trouve un terminateur null .

Maintenant, dans le second cas, parce que le ASCII 0 indique le caractère nul à l'indice donné, %s trouve la fin de la chaîne et s'y arrête.

0

Dans la première partie du code, vous affectez un pointeur char p à une valeur int, puis déréférencer le pointeur et l'affecter à un autre entier. L'opérateur de déréférencement attribue la nouvelle valeur, la chaîne contenant 0, '0', à l'adresse mémoire précédemment occupée par ch + a.

Dans le deuxième morceau de code, l'adresse mémoire du pointeur est affectée à une valeur entière de 0, et non à la chaîne '0'.