Hola.
Verán, estoy haciendo un programa que lee una lista de palabras y las compara con una lista de letras.
Aquí de lo muestro
//drawsomething.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero
//Funcion que muestra el uso y sale
void usage(char *s) {
printf("\t-----Usage-----\n\nTo add a word use: %s -a <the_word>\nTo find a word use: %s <length_of_the_word> <the_possible_letter>\n", s, s);
exit(0);
}
//Añade una nueva palabra a la lista
void add(char *word) {
FILE *wordlist;
wordlist = fopen(PATH, "w");
if(wordlist == NULL) {
printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
exit(0);
}
fwrite(word, sizeof(word), 1, wordlist);
fclose(wordlist);
}
//Funcióm que busca la palabra
void find(int tamano, char *l) {
FILE *wordlist;
char letters[13], *aux;
int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
strcpy(letters, l);
letters[12] = '\0';
wordlist = fopen(PATH, "r");
if(wordlist == NULL) {
printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
exit(0);
}
aux = fgets(NULL, 15, wordlist);
while(aux != NULL) {
if(strlen(aux) == tamano) {
for(i = 0; i < 12; i++) {
if(strstr(aux, letters[i]) != NULL) {
check++;
}
}
if(check >= tamano) {
printf("%s\n", aux);
}
}
aux = fgets(NULL, 15, wordlist);
}
}
int main(int argc, char *argv[]) {
if(argc < 3)
usage(argv[0]);
if(strcmp(argv[1], "-a"))
add(argv[2]);
else
find(atoi(argv[1]), argv[2]);
return 0;
}
El problema viene cuando lo compilo. Uso el gcc y me arroja este resultado:
drawsomething.c: En la función 'add':
drawsomething.c:13:19: error: expected expression before '=' token
drawsomething.c: En la función 'find':
drawsomething.c:28:19: error: expected expression before '=' token
drawsomething.c:37:5: aviso: el paso del argumento 2 de 'strstr' crea un puntero desde un entero sin una conversión [activado por defecto]
/usr/include/string.h:342:14: nota: se esperaba 'const char *' pero el argumento es de tipo 'char'
He revisado los errores pero no veo el fallo y como el compilador lleva tiempo haciendo cosas raras pues a lo mejor es un fallo (sin ofender al gran Stallman :laugh: :laugh: :laugh:) por que ademas, sale que tengo errores en la libreria string.h.
Si alguien tiene la solución al problema (que me jugaría el brazo a que es una chorrada) le agradeceía mucho que me ayudase. ;-)
Gracias. Un abrazo.
¡Buenas!
El error esta aqui:
#define PATH = "/home/daniel/.drawsom/wordlist"
Te sobra el =
Deberia ser:
#define PATH = "/home/daniel/.drawsom/wordlist"
Cuando utilizas #define para definir constantes se hace asi:
#define CONSTANTE VALOR
no
#define CONSTANTE = VALOR
¡Saludos!
En vez de poner esto:
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero
Poné esto:
#define PATH "/home/daniel/.drawsom/wordlist" //El PATH del fichero
Y acá:
if( strstr( aux, letters[ i ] ) != NULL) {
La función strstr tiene que recibir dos cadenas, y vos le estás pasando una cadena y un carácter. Tenés que hacer una cadena con ese carácter y el '\0'.
XD, es cierto, mira que lo he dicho, pero se me ha olvidado quitar el =. Hay sueño...
Jaja. Yo llegué tarde.
¡Buenas DaniekL!
Ya he dado con tus problemas.
El 1º esta en la definicion del PATH. No puedes definir el PATH = VALOR, lo tienes que definir como un char *.
Cambia esta linea:
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero
Por esta otra:
char * PATH = "/home/daniel/.drawsom/wordlist"; //El PATH del fichero
Y el 2º error lo tienes en el strtstr(). Esta funcion se define de esta manera:
Citarchar *strstr(const char *s1, const char *s2);
Siendo s1 y s2 2 cadenas de caracteres, y lo que hace es buscarte la cadena s1 dentro de la cadena s2. Por tanto no hace falta que recorrars tu la cadena s2 (s2
).
Por tanto, tu funcion find() ahora queda asi:
//Funcióm que busca la palabra
void find(int tamano, char *l) {
FILE *wordlist;
char letters[13], *aux;
int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
strcpy(letters, l);
letters[12] = '\0';
wordlist = fopen(PATH, "r");
if(wordlist == NULL) {
printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
exit(0);
}
aux = fgets(NULL, 15, wordlist);
while(aux != NULL) {
if(strlen(aux) == tamano) { // quitamos el for()
if(strstr(aux, letters) != NULL) { //sustituimos el puntero a caracter letters[i] por letters
check++;
}
if(check >= tamano) {
printf("%s\n", aux);
}
}
aux = fgets(NULL, 15, wordlist);
}
Un saludo.
Ostias, es verdad. :xD No me extraña que tuviese ese error, llevaba siglos sin usar #define y respecto al fallo en string.h. Porque no se que puede ser...