View Single Post
Old 24-08-2010, 16:05   #19
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da cionci Guarda i messaggi
http://www.cplusplus.com/reference/c...tring/strncpy/

No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.

Devi aggiungere \0 in fondo alla stringa.

Codice:
if ( isspace(input_string[i]))
		{	
			strncpy ( word, input_string, i);
			word[i] = '\0';
A parte che il vettore parte di default riempito di \0, quindi è superfluo farlo... Inoltre non ne capisco l'utilità...

Quote:
Originariamente inviato da cionci Guarda i messaggi
Inoltre non capisco a cosa ti serve questo:

actual_index=i+1;
input_string += actual_index;

Se fai così dovresti anche azzerare nuovamente i.
Senza contare che non puoi cambiare l'indirizzo a cui punta input_string, visto che allocata staticamente.
Dovresti usare una variabile per contare il numero dei caratteri da copiare in word.
Inoltre in pstring[i] non copi alcuna stringa e la dimensione di pstring[i] dovrebbe essere pari a strlen(word) + 1, perché deve contenere anche il carattere di fine stringa.
Questo mi serve per eliminare ciò che ho caricato dentro input_string, così da poter mettere in word sempre l'ultima parola.
Il fatto è che cercavo di spostarmi tra gli indirizzi perchè lo avevo già fatto in un altro programma, e aveva funzionato, solo che li l'array veniva passato ad una funzione come argomento, sebbene fosse allocato in modo statico ( grandezza predefinita ).

EDIT: Ne sono venuto a capo, ora le stringhe vengono caricate dentro il vettore di puntatori correttamente, così:
Codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define WORD_MAX 40
#define STRING_MAX 300
 
int main (void)
{
	char **pstring, input_string[STRING_MAX], word[WORD_MAX];
	int i=0, word_counter=0, slen=0, j=0;
	int iactual_index=0, jactual_index=0;
	
	printf("Insert a string to be sorted\n");
	if ((fgets(input_string, WORD_MAX, stdin))==NULL)
	{
		printf("Read line error, QUIT\n");
		exit(1);
	}
	slen = strlen(input_string);
	for ( i=0; i < slen; i++)
	{	
		if ( isspace(input_string[i]))
			word_counter++; // How many words we have in the string? So we know how much memory to allocate
		
	}
	if ((pstring = calloc(word_counter, sizeof(char *)))==NULL)
	{
		printf("Memory row allocation error, QUIT\n");
		exit(1);
	}
	
	for ( i=0; i < slen; i++)
	{
		if ( isspace(input_string[i]))
		{	
			strncpy ( word, input_string + iactual_index, i);
			iactual_index += i+1;
			for ( j = jactual_index; j < word_counter; j++)
			{	if ((pstring[j] = calloc(strlen(word)+1, sizeof(char)))==NULL)
				{	
					printf("Memory columns allocation error, QUIT\n");
					exit(1);
				}
				strcpy(pstring[j], word);
			}
			jactual_index++;
		}
	}
	for (i =0; i < word_counter; i++)
	{	
		fputs(pstring[i], stdout);
		printf("\n");
	}
    return 0;
}
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 24-08-2010 alle 16:18.
kwb è offline   Rispondi citando il messaggio o parte di esso