2010-06-07 15 views
15

Se me ha dado una tarea en la escuela para escribir un programa queC programa de cadena

  • Reads tres cadenas
  • tiendas la tercera cadena en la memoria asignada dinámicamente
  • imprimir los últimos 4 letras del primera palabra alfabéticamente

Aquí está el programa que tengo hasta ahora. Las cadenas están todas almacenadas en diferentes variables, lo que las hace difíciles de clasificar. Si alguien pudiera echarme una mano y ayudarme a terminar este programa, estaría muy agradecido.

#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 para una pregunta con el código actual! – ceejayoz

+0

@ceejayoz yo también: p – jcolebrand

+1

'scanf ("% s ", word)' no es seguro. Está solicitando un error de desbordamiento de búfer. Simplemente ingrese una cadena que exceda los 100 caracteres y BOOM - desbordamiento de búfer. Limite el tamaño máximo del escaneo con 'scanf ("% 100s ", word)'. Consulte http://en.wikipedia.org/wiki/Scanf#Security para obtener más información. – daotoad

Respuesta

2

Usa strcmp para encontrar la primera palabra alfabéticamente.

#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

Gracias por su respuesta, soy consciente de que tengo que hacer esto. Pero necesito ayuda para implementarlo – mrblippy

+0

El enlace que brindó muestra ejemplos de cómo usar 'strcmp()'. – VeeArr

+0

Muchas gracias, ese es el código que tenía en mente, simplemente no estaba seguro de cómo escribirlo – mrblippy

3

Puede usar el strcmp() function para comparar las cadenas.

Además, no olvide limpiar la memoria apuntada por word3 usando la función free() antes de que termine.

+0

Gracias, ¿cómo usaría strcmp en las tres cuerdas? lo siento, soy nuevo en esto – mrblippy

0

Aquí está el programa que incluye el código para obtener la subcadena de los últimos 4 caracteres de la palabra más pequeña. También se corrigió un error donde word3 siempre se configuraba con la última entrada de palabra (buffer), no como smallestword.

#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

Me generalizar, la construcción de una matriz de punteros y la clasificación con un algoritmo de ordenación mínima de burbujas (o usando qsort en el stdlib, mejor ya que tienes no extracode), si en orden ascendente, entonces primero el puntero apunta a la cadena que necesita. Incluso si es tarea, creo que debería generalizar (¿y si las palabras son 4 o 5 ...?) Y aprender a generalizar tales tareas.

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. 

EDITAR

mwstrcmp es una envoltura que dereference los punteros, ya qsort pasa punteros al objeto (que son punteros ...):

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

(advertencias son posibles demasiado perezoso para comprobar ahora ...)

0

Si desea ordenar cadenas, primero las almacena en una matriz y crea un Bubble Sort. También puede usar este algoritmo para ordenar cadenas en su lista vinculada.