2016-04-14 2 views
-1

J'ai commencé à apprendre c. Je fais un exercice et la question est la suivante. Ecrivez une fonction appelée insertString pour insérer une chaîne de caractères dans une autre chaîne. Les arguments de la fonction doivent être constitués de la chaîne source, de la chaîne à insérer et de la position dans la chaîne source où la chaîne doit être insérée . L'appel insertString (text, "per", 10); avec le texte défini à l'origine "the wrong son" entraîne l'insertion de la chaîne de caractères "per" dans le texte, en commençant par text[10]. Par conséquent, la chaîne de caractères "the wrong person" est stockée dans le tableau de texte après la fonction renvoyée.insertion d'une sous-chaîne dans une autre chaîne en c

#include<stdio.h> 
int insertString(char[],char[],int); 
int stringLength(char[]); 
int main() 
{ 
    char text[]="the wrong son"; 
    int result=insertString(text,"per",10); 
    if(result!=-1) 
    printf("string 1 is : %s \n",text); 
    else 
    printf("Not possible\n"); 
    return 0; 
} 
int insertString(char a[],char b[],int pos) 
{ 
    int i=0,j=0; 
    int lengthA=stringLength(a); 
    int lengthB=stringLength(b); 
    if(pos>lengthA) 
    return -1; 

    for(i=lengthA;i>=pos;i--) 
     a[i+lengthB]=a[i]; 

    for (i = 0; i < lengthB; ++i) 
     a[i + pos] = b[i]; 

    return 1; 
} 
int stringLength(char x[]) 
{ 
    int length=0; 
    while(x[length]!='\0') 
    length++; 
    return length; 
} 

J'ai fait cela et ça marche aussi. mais je reçois un message abort trap : 6. quand je l'ai regardé, j'ai appris que c'était une erreur parce que j'écris à la mémoire que je ne possède pas. depuis que j'ai utilisé des tableaux de caractères de longueur variable, où est le null character, indique la fin du tableau et j'essaie de l'étendre en insérant une chaîne, c'est ma compréhension. Ai-je raison jusqu'à présent? Je déplace également le null character. Je ne sais pas si c'est juste ou faux.

est donc un moyen de contourner cette erreur? Aussi, je ne sais pas encore les pointeurs et ils sont dans le prochain chapitre du manuel.

Toute aide dans ce domaine serait grandement appréciée.

+1

Vous n'utilisez pas de "tableaux de caractères de longueur variable". Vous devez soit allouer suffisamment d'espace pour votre résultat final à l'avance, soit utiliser la mémoire allouée et éventuellement la réaffecter. Recherchez les références 'malloc()' et 'realloc()'; – Logicrat

+0

"J'ai utilisé des tableaux de caractères de longueur variable" où? 'char a []' dans l'en-tête de la fonction n'est pas un tableau de longueur variable. –

+0

oh c'est ça? @Logicrat. dans le manuel, il est donné que les tableaux de caractères qui se terminent par «caractère nul» sont des tableaux de caractères de longueur variable – yash

Répondre

1

Un tableau de longueur variable est un very specific C construct qui n'a rien à voir avec ce que votre manuel appelle "tableaux de longueur variable". Si j'étais vous je ne ferais pas confiance à ce manuel s'il disait que 1 + 1 = 2. Tellement pour ça.

Un tableau de caractères qui se termine par un caractère nul est appelé chaîne par à peu près tout le monde, partout.

char text[]="the wrong son"; 

Votre manuel vous a amené à croire que text tiendra autant de caractères que vous avez besoin. Hélas, il n'existe pas de telle chose dans C. En fait, text contiendra exactement autant de caractères qu'il y a dans son initialiseur, plus 1 pour le terminateur nul, donc vous ne pouvez rien y insérer.

Pour que votre programme fonctionne, vous devez attribuer explicitement autant de caractères pour text que la chaîne résultante contiendra.

Donc, comme il y a 14 caractères dans « le mauvais fils » (y compris la terminaison) et trois caractères « par » (non compris la terminaison), vous avez besoin de 17 caractères au total:

char text[17]="the wrong son"; 

Vous pouvez également vérifier vos calculs:

int result=insertString(text, "per", 10, sizeof(text)); 
... 
int insertString(char a[], char b[], int pos, int capacity) 
{ 
    ... 
    if (lengthA + lengthB + 1 < capacity) 
    return -1; 
    ... 
+0

merci beaucoup @ n.m. Jusqu'à présent, je suis dans une mauvaise idée. cela a éclairci les choses pour moi maintenant. – yash