2016-10-25 3 views
0

Pourquoi la deuxième strncpy donne-t-elle des symboles bizarres incorrects lors de l'impression? J'ai besoin de quelque chose comme fflush (stdin)?Strncpy (Programmation chaîne C) ne fonctionne pas bien la deuxième fois

Notez que j'ai utilisé scanf ("% s", aString); pour lire une chaîne entière, l'entrée entrée commence d'abord avec un espace afin qu'il fonctionne correctement.

void stringMagic(char str[], int index1, int index2) 
{ 
    char part1[40],part2[40]; 

    strncpy(part1,&str[0],index1); 
    part1[sizeof(part1)-1] = '\0';//strncpy doesn't always put '\0' where it should 
    printf("\n%s\n",part1); 

    strncpy(part2,&str[index1+1],(index2-index1)); 
    part2[sizeof(part2)-1] = '\0'; 
    printf("\n%s\n",part2); 
} 

EDIT Le problème semble résider dans

scanf("%s",aString); 

parce que quand on utilise printf ("\ n% s", aString); et je suis entré quelque chose comme "Assez avec le monde bonjour" je reçois seulement en sortie "Assez" à cause du '\ 0'.

Comment puis-je saisir correctement la phrase entière avec des espaces stockés? Lire des personnages?

Maintenant j'utilise: fgets (aString, 100, stdin); (Reading string from input with space character?)

+0

Vérifiez si les limites (index1 + 1) et (index2 - index1) sont réellement dans la taille de la partie 2 du tableau char. Cela pourrait être la cause. Ensuite, vérifiez si str est bien formé. – SenselessCoder

+0

fflush (stdin) est un comportement indéfini, donc vous ne devriez jamais le faire dans un programme. – Lundin

+0

Mais jusqu'à maintenant cela fonctionne bien dans mon programme. Si vous connaissez une alternative je serais plus qu'heureux de l'entendre (puisque parfois après le premier scanf l'autre scanf échouera) –

Répondre

1

Afin d'imprimer une séquence de caractères correctement en utilisant %s, elle doit être terminée par un caractère nul. De plus, le symbole de terminaison doit être immédiatement après le dernier symbole à imprimer. Toutefois, cette section dans votre code: part2[sizeof(part2)-1] = '\0'; définit toujours la 39e cellule de part2 comme étant le caractère 0. Notez que sizeof (part2) retournera toujours la taille de mémoire allouée pour part2 qui dans ce cas est 40. La valeur de cette fonction ne dépend pas du contenu de part2. Ce que vous devez faire à la place est de définir le caractère (index2-index1) dans part2 sur 0. Vous savez que vous avez copié autant de caractères dans la partie 2, vous savez donc quelle est la longueur attendue de la chaîne résultante.

+0

Mais alors pourquoi part1 fonctionne-t-il parfaitement bien? J'utilise aussi la même ligne de code. Mais je comprends votre point là .. –

+0

@HoPam ma conjecture est - pure chance. Si vous ne définissez pas correctement le caractère de fin nul, certaines données aléatoires seront imprimées. Cependant, il peut arriver que le premier symbole après le contenu significatif soit '\ 0'. Cette donnée n'est pas initialisée donc ça peut être n'importe quoi. –

+0

Va essayer votre méthode et vous le ferai savoir! Merci ! –