Newsgroup: it.comp.lang.c
Titolo: Strstr blocca il programma?

Salve ragazzi... Secondo post in un paio di giorni, scusate, sto
cercando di sporcarmi un pò le mani per imparare cose nuove.. In
questo caso credo sia meglio postare direttamente il codice, cosìvi
spiego il problema, e, nel frattempo, ne approfitto per acchiappare
più suggerimenti possibili XD
== CODE ==
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct contatto {
	char nome[10];
	char cognome[10];
	char numero[10];
	struct contatto *next;
} *primo, *ultimo;
// Without \0 char
size_t m_strlen(char *str) {
	int i=0;
	while(1) {
		if(str[i] == '\0') return i;
		i++;
	}
}
// str[nlen] = \0
char *spacefill(char *str, size_t nlen) {
	int i, olen = m_strlen(str);
	char *nstr = malloc(nlen);
	strncpy(nstr, str, olen);
	memset(nstr+olen, ' ', nlen-olen-1);
	nstr[nlen] = '\0';
	return nstr;
}
char get_choice(  ) {
	char input;
	puts("\n\n=== Menu di selezione ===\n1\tInserisci nuovo contatto
\n2\tCerca contatto\n3\tMostra elenco contatti\n4\tEsci\n");
	printf("Scegli: "); scanf("%1s", &input);
	return input;
}
int aggiungi_contatto(  ) {
	char nome[10], cognome[10], numero[10];
	puts("== Inserimento nuovo contatto\n");
	struct contatto *nuovo = malloc( sizeof(struct contatto) );
	printf("Nome: "); scanf("%9s", nome);
	printf("Cognome: "); scanf("%9s", cognome);
	printf("Numero: "); scanf("%9s", numero);
	strncpy(&nuovo->nome, nome, 9);
	strncpy(&nuovo->cognome, cognome, 9);
	strncpy(&nuovo->numero, numero, 9);
	printf("Riepilogo:\t%s %s - %s\n", &nuovo->nome, &nuovo->cognome,
&nuovo->numero);
	// Controlli vari
	if(ultimo) ultimo->next = nuovo;
	if(!primo) primo = nuovo;
	ultimo = nuovo;
	// In base ai controlli...
	return 1;
}
void mostra_contatti( char *to_search ) {
	if(!primo) return;
	struct contatto *current = primo;
	puts("+----------+----------+----------+");
	puts("|   Nome   |  Cognome |  Numero  |");
	puts("+----------+----------+----------+");
	while(1) {
		if(current == 0) break;
		if(!to_search || strstr(&current->nome, to_search)) {
			char *m_nome = spacefill(&current->nome, 11);
			char *m_cognome = spacefill(&current->cognome, 11);
			char *m_numero = spacefill(&current->numero, 11);
			printf("|%s|%s|%s|\n", m_nome, m_cognome, m_numero);
		} else puts("no tosearch OR not found");
		current = current->next;
	}
	puts("+----------+----------+----------+");
}
int main(  ) {
	puts("################################################");
	puts("####                                        ####");
	puts("####          Rubrica C - __PaTeR           ####");
	puts("####                                        ####");
	puts("################################################");
	int flag = 1;
	while(flag) {
		char choice = get_choice();
		switch( choice ) {
			case '1':
				aggiungi_contatto();
				break;
			case '2':
				;char ricerca[10];
				printf("Cosa cerchi? "); scanf("%9c", ricerca);
				mostra_contatti( ricerca );
				break;
			case '3':
				mostra_contatti( 0x0 );
				break;
			case '4':
				flag = 0;
				break;
			default:
				puts("Scelta non valida");
		}
	}
}
== END CODE ==
Aaallora... Ci sono molte cose che potrebbero andare meglio:
1) QUando compila mi da un sacco di warning su puntatori incompatibili
( char * != char (*) [10] )
2) Lo scanf col %9c o %1c è poco ( nulla ) performante, ovrei scrivere
una funzione che prende da stdin con fgetc
3) Uso un flag per uscire dal while XD cosa che alcuni in alcuni post
che ho letto hanno criticato ( non so se per flag intendessero
questo ) ma non ho capito il perchè...
Per il resto... strstr non funge proprio, ho messo l'else nel while
proprio per vedere se in effetti ritornava qualcosa, invece il
programma s'impalla e dopo un pò va in segfault.
Stavo pensando se esistesse un qualcosa tipo strnstr, ma non sembra
esistere per il c ( ho letto che si trova in string.h, ma sebbene sia
inclusa il linker non la trova )
Poi... sbizzarritevi a trovare difetti e/o miglioramenti che potrei
apportare :)

 			char *m_numero = spacefill(&current->numero, 11);
Stessa cosa detta su per &. Nota che non liberi la memoria che allochi
dentro spacefill(). 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it