2017-08-25 9 views
-3

coincé dans le tableau et la chaîne comparer avec strcmp c pourquoi ça marche? compilateur est resté coincé à if(strcmp(c,ch[i]) == 0){coincé dans le tableau et la chaîne comparer avec strcmp c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    char ch[]="asdfghjkl"; 
    char c; 
    int n=sizeof(ch)/sizeof(char); 
    scanf("%c",&c); 
    for(int i=0;i<n;i++){ 
     if(strcmp(c,ch[i]) == 0){ 
      printf("%c is in %d\n",c,i+1); 
      break; 
     }else if(i==n-1){ 
      printf("%c not fond\n",c); 
     } 
    } 
    return 0; 
} 
+4

'strcmp' prend deux * chaînes * comme arguments. Vous passez un 'char' et une chaîne. Votre compilateur ne s'en plaint-il pas? Lire [Comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

La fonction ['strcmp'] (http://en.cppreference.com/w/c/string/byte/strcmp) permet de comparer * les chaînes *. Vous voulez comparer * caractères *. –

+0

le type de 'c' est' char' (un caractère, pas de chaîne). 'strcmp' nécessite' char * '. – BLUEPIXY

Répondre

0

Déclaration de strcmp: int strcmp (const char * s1, const char * s2); Strcmp attend des chaînes, mais vous essayez de transmettre char.

Utilisez

if (c == ch[i]) 
+2

Qu'est-ce qui ne va pas? Est-ce que quelqu'un peut expliquer – Ritesh

1

Je crois que votre compilateur devrait se plaindre que vous utilisez strcmp correctement: Vous deux caractères de passage à deux const char* s ce qui est certainement un UB. Ce serait bien si votre compilateur vous empêche de le faire en lançant une erreur.

Le prototype de strcmp est (en string.h)

int strcmp(const char * s1, const char * s2); 

Puisque vous avez deux caractères et char est un type de base, vous pouvez les comparer directement:

if (c == ch[i]) 
+1

Ce n'est pas "UB", c'est une violation de contrainte des formes autorisées d'assignation simple. Lors du passage de paramètres à une fonction, "... les arguments sont convertis implicitement, comme par affectation, en les types des paramètres correspondants " (6.5.2.2/7). Aller de 'char' à' char * 'n'est pas un formulaire valide. Cela signifie que le compilateur doit donner un diagnostic ou qu'il n'est pas conforme. – Lundin