2016-09-22 4 views
0

Je fais un projet d'école en C où je dois faire une fonction qui reçoit une chaîne d'entrée et inverse la chaîne comme sortie. Je pourrais utiliser scanf("%s", answer);, mais cela ne stocke que le premier mot de la chaîne. Par conséquent, j'ai décidé d'aller avec gets(answer). Je sais que cela est dangereux parce qu'il n'attribue pas une taille de mémoire spécifique dans answer, mais je l'ai fait allready ce lors de la définition du tableau: char answer[100];reçoit un message d'avertissement dans c

Je ne suis pas intéressé à utiliser fgets parce que les enseignants compileront en utilisant Cygwin et ce avertissement habituellement montre que sur Terminal lorsque vous utilisez un Mac:

warning: this program uses gets(), which is unsafe. 

Il affiche ce dans le bon terminal avant de demander à l'utilisateur de taper dans une chaîne. L'autre problème que j'ai est que gets(answer) attrape parfois l'entrée du printf("Type a string: ") dessus. Y a-t-il un moyen de le faire?

code source:

#include <stdio.h> 
#include <string.h> 

void reverseString(); 

int main() { 

    char str[100]; 

    printf("Type your string here: "); 
    gets(str); /* Catching return from prinf so add one extra */ 
    gets(str); 

    reverseString(str); 
} 

void reverseString(char string[]) { 

    char temp; 
    int startChar = 0; 
    int endChar = strlen(string) - 1; 

    while (startChar < endChar) { 
     temp = string[startChar]; 
     string[startChar] = string[endChar]; 
     string[endChar] = temp; 
     startChar++; 
     endChar--; 
    } 
    printf("\nReverse string is: %s\n", string); 
} 

Exécution du code:

warning: this program uses gets(), which is unsafe. 
Type your string here: hello world 

Reverse string is: dlrow olleh 

EDIT: Je essayé d'utiliser fgets(str, sizeof(str), stdin), mais il continue de sauter la partie d'entrée de l'utilisateur. J'ai également défini une taille de tampon pour str comme ceci: #define BUFFER_SIZE 100 et l'a ajouté au tableau, char str[BUFFER_SIZE].

EDIT: La raison apaerant pourquoi fgets(str, sizeof(str), stdin) ne fonctionne pas, est parce qu'il attrape le \n de stdin. Je pourrais devoir le rincer d'une manière ou d'une autre.

+4

'gets' est déprécié. Utilisez 'fgets' ou ignorez le message d'avertissement en sachant qu'une entrée trop longue peut surcharger votre mémoire tampon et provoquer un comportement indéfini. –

+0

_'gets (réponse) 'saisit parfois l'entrée de' printf ("Tapez une chaîne:") 'au-dessus de it_: qu'est-ce que cela signifie? Pourriez-vous être plus précis ? Peut-être que vous devriez poser une autre question spécifique avec un [mcve]. –

+1

N'utilisez pas 'gets()' - il ne peut tout simplement pas être utilisé en toute sécurité. Voir [Pourquoi 'gets()' est si dangereux] (http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used). –

Répondre

-2

La question que je comprends est de vous donner un moyen de lire dans une chaîne avec des espaces. Cependant, vous ne voulez pas utiliser fgets() pour une raison que je n'ai pas suivie. Voici une autre façon de le faire.

scanf ("%[^\n]%*c", str); 
+0

Vous auriez dû le suivre. Vous ne savez pas exactement ce que vous voulez faire avec 'scanf' ici, cette ligne est fausse. – Olaf

+0

1) 'name' n'est pas déclaré, moins défini. 2) En quoi cette ligne est-elle plus sûre que «fgets»? 3) Vous sauriez si vous avez eu des recherches sur la raison de l'avertissement OP obtenu! – Olaf