2010-06-07 4 views
15

m'a donné une tâche à l'école pour écrire un programme quiprogramme de chaîne C

  • Reads trois cordes
  • Stocke la troisième chaîne dans la mémoire allouée dynamiquement
  • Imprimer les 4 dernières lettres du premier mot par ordre alphabétique.

Voici le programme que j'ai jusqu'à maintenant. Les chaînes sont toutes stockées dans des variables différentes, ce qui les rend difficiles à trier. Si quelqu'un pouvait me donner un coup de main et m'aider à terminer ce programme, je serais très reconnaissant.

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

int main() 
{ 
    char word1[101]; 
    char word2[101]; 
    char* word3; 
    char buffer[101]; 
    scanf("%s", word1); 
    scanf("%s", word2); 
    scanf("%s", buffer); 
    word3 = (char *) malloc(strlen(buffer)+1); 
    strcpy(word3, buffer); 

    return 0; 
} 
+8

+1 pour une question de devoirs avec code réel! – ceejayoz

+0

@ceejayoz moi aussi: p – jcolebrand

+1

'scanf ("% s ", mot)' est dangereux. Vous demandez une erreur de débordement de tampon. Entrez simplement une chaîne de plus de 100 caractères et BOOM - buffer overflow. Limitez la taille maximale de l'analyse avec 'scanf ("% 100s ", mot)'. Voir http://en.wikipedia.org/wiki/Scanf#Security pour plus d'informations. – daotoad

Répondre

2

Utilisez strcmp pour trouver le premier mot par ordre alphabétique.

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

int main() 
{ 
    char word1[101]; 
    char word2[101]; 
    char* word3; 
    char buffer[101]; 
    scanf("%s", word1); 
    scanf("%s", word2); 
    scanf("%s", buffer); 

    char* smallestword = word1; 
    if (strcmp(smallestword,word2) > 0) // smallest is bigger than word2 
    smallestword = word2; 
    if (strcmp(smallestword,buffer) > 0) // smallest is bigger than buffer 
    smallestword = buffer; 

    word3 = (char *) malloc(strlen(smallestword)+1); 
    strcpy(word3, buffer); 
    return 0; 
} 
+0

Merci pour votre réponse, je suis conscient que je dois le faire. Mais j'ai besoin d'aide pour l'implémenter – mrblippy

+0

Le lien qu'il a fourni montre des exemples d'utilisation de 'strcmp()'. – VeeArr

+0

Merci beaucoup, c'est le code que j'avais en tête, je n'étais tout simplement pas sûr de savoir comment l'écrire – mrblippy

3

Vous pouvez utiliser le strcmp() function pour comparer les chaînes.

De même, n'oubliez pas de nettoyer la mémoire pointée par word3 en utilisant la fonction free() avant d'avoir terminé.

+0

Merci, comment pourrais-je utiliser strcmp sur les trois cordes si? désolé je suis nouveau à cette – mrblippy

0

Voici le programme incluant le code pour obtenir la sous-chaîne des 4 derniers caractères du plus petit mot. Correction d'un bug où word3 était toujours défini sur l'entrée de dernier mot (buffer), pas smallestword comme prévu.

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

int main() { 
char word1[101]; 
char word2[101]; 
char* word3; 
char buffer[101]; 

scanf("%s", word1); 
scanf("%s", word2); 
scanf("%s", buffer); 

char* smallestword = word1; 
if (strcmp(smallestword,word2) > 0) // smallest is bigger than word2 
     smallestword = word2; 
if (strcmp(smallestword,buffer) > 0) // smallest is bigger than buffer 
     smallestword = buffer; 

word3 = (char *) malloc(strlen(smallestword)+1); 
strcpy(word3, smallestword); 

int m = strlen(word3), n = m - 4; // set offsets for substr 
char* word3_substr = (char *) malloc(m-n); 
strncpy(word3_substr, word3+n, m-1); 

printf("%s", word3_substr); 

return 0; 
} 
0

Je généraliser, la construction d'un tableau de pointeurs et de tri avec un algorithme de tri à bulles minimal (ou avec qsort dans le stdlib, mieux puisque vous ne l'avez pas à extracode), si dans l'ordre croissant, puis premier Le pointeur pointe vers la chaîne dont vous avez besoin. Même s'il s'agit de devoirs, je pense que vous devriez généraliser (si les mots sont 4 ou 5 ...?) Et apprendre à généraliser de telles tâches.

char *ptrs[] = { word1, word2, NULL }; 
// later you initilize third too 
ptrs[2] = word3; 
// use qsort with strcmp as comp. function 
qsort(ptrs, sizeof(void *), 3, mwstrcmp); 
// ... 
// pick firts ptr 
char *first = ptrs[0]; 
// print last 4 chars, see other answers or: 
// an alternative naive way of getting last 4 chars printed 
int l = strlen(first); 
char *fourstr = first; 
if (l > 4) fourstr += l - 4; 
printf("%s", fourstr); // if length is < 4, it prints the whole string. 

EDIT

mwstrcmp est une enveloppe qui déréférencer les pointeurs, car qsort passe des pointeurs vers l'objet (qui sont des pointeurs ...):

int mwstrcmp(const char **a, const char **b) 
{ 
    return strcmp(*a, *b); 
} 

(avertissements sont possibles trop paresseux pour vérifier maintenant ...)

0

Si vous souhaitez trier les chaînes, commencez par les stocker dans un tableau et créer un Bubble Sort. Vous pouvez également utiliser cet algorithme pour trier les chaînes dans votre liste chaînée.