0
votes

STRCMP ne fonctionne pas et je ne semble pas comprendre pourquoi - la transformation en code ASCII rend le programme fonctionner comme prévu.

Tout d'abord, ne critiquez pas la manière dont le programme est écrit, car c'est ce que nous étudions dans mon pays.

Je sais que c'est un mélange de C et C ++ et les choses que j'utilise sont obsolètes, Mais c'est comme ça que les choses sont ici. P>

Donc, je dois faire un programme qui obtient comme une entrée n mots. Ensuite, je dois imprimer les mots qui ont le dernier comme préfixe. P>

E.g. P> xxx pré>

Ceci est mon programme. Cela fonctionne comme prévu: p> xxx pré>

mais initialement, il ressemblait à ceci: p> xxx pré>

et il jette des erreurs:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0167   argument of type "char" is incompatible with parameter of type "const char *"   ConsoleApplication1 25  

Severity    Code    Description Project File    Line    Suppression State
Error   C2664   'int strcmp(const char *,const char *)': cannot convert argument 1 from 'char' to 'const char *'    ConsoleApplication1     25  


10 commentaires

Si vous utilisez des pièces C dans le code C ++, il est toujours C ++.


Qu'entendez-vous par «transformer en ASCII»?


Vous ne devez pas appeler strcmp sur chaque caractère de la chaîne. Il compare déjà les chaînes après tout.


@ user3121023 Je comparais chaque lettre. une première lettre de [i] avec une première lettre de [N-1], et ainsi de suite.


@Gerhardh Eh bien, il semble plus comme C pour moi tbh. La seule chose C ++ que j'utilise est iostream avec Cin / Cout. À l'exception de cela, tout est le style C, c'est ce que je l'ai marqué comme C. Également, je ne savais pas que je ne peux pas utiliser STRCMP pour comparer chaque caractère.


@JOHNSMITH ALORS STRCMP est le mauvais outil pour le travail, il compare les chaînes non des caractères.


@john ouais. Je ne savais pas que je ne peux pas l'utiliser pour comparer des personnages. Merci.


Il suffit de supprimer complètement la boucle j complètement et utilisez si (STRCMP (A [i], A [N-1])! = 0) .


@ DAVIDC.RANKIN - L'exigence ici est de trouver des chaînes pour lesquelles la chaîne finale est un préfixe . Ce n'est pas à la recherche de chaînes identiques, donc STRCMP ne fonctionnera pas.


@Petebecker - strncmp alors.


3 Réponses :


1
votes
    for (int i = 0; i < n - 1; i++)
    {
        ok = 1;
        if (strncmp(a[i], a[n-1], p) != 0)
        {
            ok = 0;
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }

1 commentaires

Merci. Je ne savais même pas que STRNCMP existait.



1
votes

Dans cette déclaration xxx pré>

les deux expressions a [i] [j] [j] code> et A [n-1] [j] code > Demandez au type Char alors que la fonction STRCMP code> attend deux pointeurs sur les chaînes de type char * code>. P>

Le compilateur émet une erreur. P>

Vous pouvez simplifier votre premier programme à l'aide de la fonction standard strncmp code>. Par exemple P>

size_t p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
    if ( strncmp( a[i], a[n-1], p ) == 0 ) cout << a[i] << " ";
}


3 commentaires

Même si votre réponse est un peu meilleure, j'ai choisi l'autre comme le correct parce qu'il était plus rapide. Pouvez-vous élaborer en utilisant "cstring" au lieu de "string.h"? Pour autant que je sache, la cStch doit être évitée (parce que c'est obsolète).


@Johnsmith C'est une exigence de la norme C ++.


@Johnsmith - met les noms des fonctions C déclarés dans dans l'espace de noms std :: . Ce n'est pas obsolète et il n'y a aucune raison de l'éviter. Il y avait des gens tôt sur ceux qui pensaient que la toute la bibliothèque C devrait être tolérée jusqu'à ce qu'elle puisse être retirée. Cet effort a rapidement échoué.



0
votes

La modification la plus simple du code dans la question est de modifier le test de si (STRCMP (A [I] [J], A [N] [J])! = 0) Pour si (a [i] [j]! = A [N-1] [J] [J]) .


0 commentaires