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.
3 respuestas
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] << " ";
}
}
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>
,
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])
.
Preguntas relacionadas
Nuevas preguntas
c++
C ++ es un lenguaje de programación de propósito general. Originalmente fue diseñado como una extensión de C, y tiene una sintaxis similar, pero ahora es un lenguaje completamente diferente. Use esta etiqueta para preguntas sobre el código (que se compilará) con un compilador de C ++. Utilice una etiqueta específica de la versión para preguntas relacionadas con una revisión estándar específica [C ++ 11], [C ++ 14], [C ++ 17] o [C ++ 20] etc.