La concaténation d'un terminateur null provoque une erreur de segmentation

StackOverflow https://stackoverflow.com/questions/1669589

  •  13-09-2019
  •  | 
  •  

Question

je suis nouvelle C et récemment j'ai un problème avec une fonction strcat.J'ai un tableau d'arguments définis comme:

#define MAXARGS 10;

char *argvalues[MAXARGS];

Tout ce que je veux est de concaténer le dernier non-null élément du tableau avec un terminateur null.Voici le morceau de mon code:

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){
    strcat(argvalues[i-1], '/0');
    printf("i is: %d\n", i);
    break;
  }
  i++;
}

Avez-vous une idée pourquoi erreur de segmentation se produit et est-ce réellement la bonne façon de l'utiliser strcat?

Était-ce utile?

La solution

strcat Assemble deux pointeurs ombles comme ainsi.

char *p1[12];
char *p2 = "world";
strcpy(p1,"hello ");
strcat(p1,p2);

pi détient maintenant - Bonjour tout le monde Vous devez vous assurer que la destination a assez de place pour le résultat concaténé.

Autres conseils

Votre boucle d'errance après la fin de votre tableau.C'est ce qui est la cause de l'erreur de segmentation.En C il n'y a aucune garantie qu'une variable non initialisée est NUL ou quoi que ce soit d'autre d'ailleurs.Si votre boucle continue en boucle jusqu'à ce qu'il tente d'accéder à argvalues[11], qui n'existe pas.Donc erreur de segmentation.

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){

Ces deux se contredisent l'une l'autre.Il ne sera jamais à même d'arriver à l'instruction si, parce que la boucle while va sortir en premier lorsqu'il découvre que argvalues[i] == NULL.Et si tous les 10 de vos arguments sont ensemble, puis vous essayez d'accéder à argvalues[11], qui permettra d'erreur de segmentation, comme mentionné précédemment.

Pour bien utiliser strcat vous devez avoir une chaîne de la mémoire tampon qui est assez grand pour accepter la chaîne que vous concaténez à la fin de celui-ci.Par exemple, si vous voulez ajouter "monde" sur un du tampon contenant déjà "bonjour" bonjour le tampon doit être déclaré au moins aussi longtemps que "bonjour"+" monde" plus 1 plus de caractère (le '\0' à la fin).

// Here's an example.
char buffer[12];
strcpy(buffer, "hello");
strcat(buffer, " world");

Si vous essayez de le faire, ça ne fonctionne pas:

// Buffer isn't big enough to copy into.
char buffer[] = "hello";
strcat(buffer, " world");

Pour comprendre exactement ce que vous êtes en train de faire, nous aurons besoin d'un peu plus de description et le code.Le meilleur endroit pour ajouter le terminateur null à vos arguments seraient quand les arguments sont d'abord définies.Selon la façon dont vous êtes le réglage de vos arguments, il peut déjà être le cas pour vous.

Comme Alcon a souligné, vous ne serez jamais atteindre le strcat() avec ce code.Vous avez besoin de changer votre boucle à quelque chose comme ceci:

while (i < MAXARGS) {
   ...
}

Aussi, le passage d'un pointeur null pour strcat().Il prend une chaîne de caractères, pas un personnage.'\0' est un caractère nul, qui vous permettra d'être "promu" à un pointeur null."" ou "\0" est une chaîne vide, mais ce ne serait pas ajouter un null soit.strcat(0) n'est pas la bonne chose à utiliser ici, parce qu'il semble pour le terminateur null avant de la concaténation.Par conséquent, vous ne pouvez pas l'utiliser pour ajouter un terminateur null!

Si vous n'en avez pas déjà un terminateur null sur chaque chaîne dans le tableau, ou sinon savoir sa longueur, je ne vois pas comment vous pouvez trouver de la fin pour ajouter un terminateur null.Il semble comme une sorte de "appelez-moi et je vais vous raconter mon numéro de téléphone" de la situation.

Ce n'est pas la bonne façon de le faire!

Si vous êtes sûr que votre char* n'a pas de "\0", vous pouvez faire vos trucs de ce genre:

char* oldargvalues = argvalues;
while(*argvalues++);
argvalues = 0;

(oldargvalues est de garder une trace de début de la char*).Mais même si, c'est étrange, car la boucle fin de si vous avez déjà un "\0" char.

Je ne comprends pas la boucle que vous avez.On dirait qu'il ne fera jamais rien.Dans la boucle while-vous vérifier si argvalues[i] != La valeur NULL.Dans un très prochain rapport, vous vérifiez si la valeur est NULLE.Un de ceux est toujours faux (il ne peut pas être à la fois NULLE et non NULLE), de sorte que cette boucle ne fera jamais rien.Je pense que vous voulez quelque chose comme ce qui suit:

#define MAXARGS 10;
char *argvalues[MAXARGS];
int i = 1;
while (i < MAXARGS) 
{
   if (argvalues[i] == NULL)
   {
      //Notice here:  as mentioned by other posters, you need to pass 
      //a string to strcat, not a char
      strcat(argvalues[i-1], "");
      printf("i is: %d\n", i);
      break;
    }

    i++;
}

Qu'est-ce que Alcon et Fred dit sont vraies, plus il ressemble à votre argvalues sont déjà nuls terminés, donc on ne sait pas ce que vous êtes vraiment essayer de le faire. Vous ne devriez pas utiliser strcat à moins que la première chaîne d'argument est dans un tampon que vous avez alloué si vous savez qu'il est assez grand. Comme si vous avez void main(char* argv[], int argc) vous ne dites jamais strcat(argv[i], ...), même si strcat(..., "") est un no-op.

Quelques problèmes:

Votre argvalues tableau n'est pas initialisée automatiquement à toutes les NULS, vous aurez à le faire à la main, de sorte que le droit de la chauve-souris, vous ne pouvez pas détecter la valeur NULL dans votre boucle while() comme d'autres l'ont indiqué.

Comment est argvalues être ensemble?

Merci à tous pour les réponses !!!!!

Je crois que je résolu le problème, surtout ce que je l'ai fait est de créer une nouvelle variable char [size], puis copiez le dernier argument, mettez le terminateur nul dans cette variable puis copiez revenir au dernier argument. fonctionne bien, mais le code est en désordre. donc pourrait faire grincer avec elle plus tard.  strcat est pour les chaînes, et non pour les caractères, Merci de remarquer tous les manques dans mon code!

Merci à tous !!!! très apprécié!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top