2013-03-17 3 views
2

J'ai écrit un simple programme c qui ne prend que les deux premiers caractères d'un mot et prend les trois derniers caractères du second mot. J'utilise strncpy pour copier seulement la première lettre de name1 et nommer avec les trois derniers caractères de name2.strncpy append 1 extra (étrange ou aléatoire) char

Cependant, quand je l'exécute. sortie en quelque sorte comme

Ediacy //correct 

acy //wrong 

Ed? 
acy //wrong 

Edk 
    acy //wrong 

Edv 
    acy //wrong 

// code sample 
#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char name[100]; 

    char name1[] = "Edison"; 
    char *name2 = "Tracy"; 

    strncpy(name, name1, 2); // instead of get Ed, it tried to append one extra char behind it. 
    strcat(name, name2+2); 

    printf("%s\n", name); 

    return 0; 
} 

je vraiment apprécier si quelqu'un me aider à comprendre pourquoi il agit comme ça et comment je peux corriger?

Répondre

5

strncpy n'ajoute pas de terminateur nul si la taille est trop petite.

Essayez ceci:

strncpy(name, name1, 2); 
name[2] = '\0'; 
+1

+1 Et * toujours * écrit les caractères 'n', où N est le troisième paramètre. Si la chaîne source est plus petite que N-chars, elle sera remplacée par N avec null-chars. (Toujours, bien sûr, à condition que la mise en œuvre soit conforme aux normes). – WhozCraig

+0

c'est la réponse, merci beaucoup – eded

+0

Rappelez-vous que la même règle est également valable pour fgets() et des fonctions similaires. – none