8
votes

Comment puis-je retourner une chaîne au système d'exploitation dans mon code C?

Je suis un débutant C et c'est mon code C: xxx

qui montrera une erreur. Alors, comment puis-je retourner une chaîne en code C?


5 commentaires

Main doit renvoyer un int , non ifs, ands ou saut. Qu'est-ce que vous attendez exactement à cette chaîne? (Bien que la "chaîne" soit vraiment une constante de caractère car elle utilise des délimiteurs ' au lieu de ")


Une erreur? Copiez le message d'erreur exactement. Quoi, précisément, es-tu attendu?


Il manque un point-virgule après la déclaration de retour; cela est susceptible d'être l'erreur. Retourner 'SSS' à partir de principal fonctionnera techniquement (puisqu'il s'agit d'un int ), mais ce n'est certainement pas ce qui est souhaité.


Cette question doit être clarifiée, de nombreuses réponses ici supposent que vous demandez: "Comment puis-je retourner une chaîne au système d'exploitation en C?"


Dupliqué possible de renvoyer C chaîne de la fonction


6 Réponses :


1
votes

Malheureusement, il n'y a aucun moyen de le faire.

Vous pouvez ajouter quelque chose à la fin de votre programme C comme: xxx


0 commentaires

-1
votes

Vous pourriez être capable d'utiliser des variables d'environnement pour cela. Pas sûr cependant.


1 commentaires

Peut-être découvrir et Mettez à jour votre réponse (pas ici dans les commentaires)?



12
votes

Si vous souhaitez renvoyer une chaîne d'une fonction (autre que principal code>), vous devez faire quelque chose comme ça.

#include <stdio.h>

const char * getString();

int main()
{
    printf("Hello, World!\n");
    printf("%s\n", getString());
    return 0;
}

const char * getString()
{
    const char *x = "abcstring";
    return x;
}


6 commentaires

Attention, les littéraux strings sont Const - mais le compilateur ne le sais pas toujours!


@Martin Beckett, que diriez-vous d'ajouter const avant la déclaration? Tels que const char * .


@Martinbeckett, que voulez-vous dire par "mais le compilateur ne le sais pas toujours" ?


@Pacerier Il n'y a pas de règles (AFAIK) sur ce qui arrive à la mémoire occupée par la chaîne lorsque cette fonction sort. Selon votre architecture, il peut être en lecture seule sur le segment de programme ou dans la mémoire de données. Donc, même si cela "fonctionne", ne comptez pas dessus.


@Martinbeckett, dis-tu que lorsque nous lisons la chaîne (la ligne printf ("% s \ n", getstring ()); ), nous pouvons réellement obtenir des données de déchets?


Merci !!, ça m'aidez!



1
votes

Vous ne retournez pas de chaîne. Applications Sortie avec un code de sortie entier.

classiquement, la sortie avec un retour de 0 indiquera toujours que votre application est sortie sans erreur / complétée. Vous retournez un entier autre que 0 pour montrer que votre demande est excitée anormalement.

Vous pouvez lancer une exception et la gérer avec une méthode de journalisation plus élevée dans la pile d'appels, ou vous pouvez simplement retourner quelque chose d'autre que 0 et vous assurer que vous l'aviez documenté dans vos notes de version sur le moyen d'entier d'erreur. < / p>


0 commentaires

2
votes

Vous pouvez le faire d'une manière similaire à scanf code>. En d'autres termes:

void foo(char **value_to_return) {
    *value_to_return = malloc(256); // Store 256 characters
    strcpy(*value_to_return, "deposited string");
}

int main() {
    char *deposit;
    foo(&deposit);
    printf("%s", deposit);
    return 0;
}


0 commentaires

4
votes

La magie est dans le mot clé statique code> qui conserve la teneur en mémoire de la chaîne même après la fin de la fonction. (Vous pouvez le considérer comme étendre la portée de la variable.)

Ce code prend un caractère à chaque fois, puis les concaténe dans une chaîne et l'enregistre dans un fichier: P>

#include <stdio.h>
#include <conio.h>

char* strbsmallah ()
{
  static char input[50];
  char position = 0, letter;
  scanf("%c", &letter);
  while (letter != '~') { // Press '~' to end your text
    input[position] = letter;
    ++position;
    scanf("%c", &letter);
  }
  input[position] = '\0';
  char *y;
  y = (char*) &input;
  //printf("%s\n ", y);
  return y;
}

int main() {
  printf("\n");
  FILE *fp;
  fp = fopen("bsmallah.txt", "w+");
  fprintf(fp, strbsmallah());

  while (!_kbhit())
    ;

  return 0;
}


2 commentaires

Mais il écrasera la mémoire si vous tapez plus de 50 caractères (?).


Qu'est-ce que _kbhit ()? Est-il spécifique à une plate-forme particulière (disons, Windows)?