En primer lugar, no critiquen la forma en que está escrito el programa, porque esto es lo que estudiamos en mi país.

Sé que es una mezcla de C y C ++ y las cosas que uso están desactualizadas, pero así es como están las cosas aquí.

Entonces tengo que hacer un programa que reciba como entrada n palabras. Luego tengo que imprimir las palabras que tienen el último como prefijo.

E.g.

input: 
n=6 
raita grai raid raion straie rai
output:
raita raid raion

Este es mi programa Funciona como se esperaba:

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int n;
    char a[100][100];
    bool ok=1;
    cin >> n;
    cin.get();
    for (int i = 0; i < n; i++)
    {
        cin.get(a[i], 100);
        cin.get();
    }
    int p = strlen(a[n - 1]);
    for (int i = 0; i < n - 1; i++)
    {
        for(int j = 0; j < p; j++)
        {
            ok = 1;
            if ((unsigned int)a[i][j] != (unsigned int)a[n-1][j])
            {
                ok = 0;
                break;
            }
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }
}

Pero inicialmente, se veía así:

/* strstr example */
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int n;
    char a[100][100];
    bool ok=1;
    cin >> n;
    cin.get();
    for (int i = 0; i < n; i++)
    {
        cin.get(a[i], 100);
        cin.get();
    }
    int p = strlen(a[n - 1]);
    for (int i = 0; i < n - 1; i++)
    {
        for(int j = 0; j < p; j++)
        {
            ok = 1;
            if (strcmp(a[i][j], a[n-1][j]) != 0)
            {
                ok = 0;
                break;
            }
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }
}

Y arroja algunos errores:

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  

Parece que no puedo entender por qué sucede esto. ¿Puede alguno de ustedes ayudarme a entender? Además, ¿debería usar la conversión a (unsigned int) o simplemente strcmp?

Gracias.

0
John Smith 29 abr. 2020 a las 18:01

3 respuestas

La mejor respuesta
 int strcmp(const char *s1, const char *s2);

strcmp se usa para comparar string y string. Pero en su código, compara char y char (a[i][j] y a[n-1][j]).

En su caso, puede usar strncmp que compara solo los primeros (como máximo) n bytes (en su caso, n es strlen(a[n-1])) de dos cadenas:

int strncmp(const char *s1, const char *s2, size_t n);

Entonces, su programa se convierte en el siguiente:

    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
Hitokiri 29 abr. 2020 a las 15:21

En esta declaración

if (strcmp(a[i][j], a[n-1][j]) != 0)

Las dos expresiones a[i][j] y a[n-1][j] tienen el tipo char mientras que la función strcmp espera dos punteros a cadenas del tipo char *.

Entonces el compilador emite un error.

Puede simplificar su primer programa utilizando la función estándar strncmp. Por ejemplo

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] << " ";
}

Preste atención a que debe usar el encabezado <cstring> en lugar del encabezado <string.h>,

1
Vlad from Moscow 29 abr. 2020 a las 15:32

El cambio más simple al código en la pregunta es cambiar la prueba de if (strcmp(a[i][j], a[n-1][j]) != 0) a if (a[i][j] != a[n-1][j]).

0
Pete Becker 29 abr. 2020 a las 16:09