Quote:
Originariamente inviato da cionci
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
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;
}