2010-06-07 8 views
15

I dano zadanie w szkole, aby napisać program, któryC Program ciąg

  • Odsłon trzy ciągi
  • Przechowuje trzeci ciąg w dynamicznie przydzielonej pamięci
  • wydrukować ostatnie 4 litery pierwsze słowo alfabetycznie.

Oto program, który do tej pory miałem. Łańcuchy są przechowywane w różnych zmiennych, co utrudnia ich sortowanie. Jeśli ktokolwiek mógłby mi pomóc i pomóc mi zakończyć ten program, byłbym bardzo wdzięczny.

#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 za zadanie domowe z aktualnym kodem! – ceejayoz

+0

@eejayoz me too: p – jcolebrand

+1

'scanf ("% s ", słowo)' jest niebezpieczne. Pytasz o błąd przepełnienia bufora. Po prostu wpisz ciąg znaków, który przekracza 100 znaków, a BOOM - przepełnienie bufora. Ogranicz maksymalny rozmiar skanowania za pomocą 'scanf ("% 100s ", słowo)'. Więcej informacji można znaleźć na stronie http://en.wikipedia.org/wiki/Scanf#Security. – daotoad

Odpowiedz

2

Aby znaleźć pierwsze słowo alfabetycznie, użyj strcmp.

#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

Dziękuję za odpowiedź, wiem, że muszę to zrobić. Ale potrzebuję pomocy przy jego implementacji. – mrblippy

+0

Podany link pokazuje przykłady użycia 'strcmp()'. – VeeArr

+0

Dziękuję bardzo, to kod, który miałem na myśli, po prostu nie wiedziałem, jak to napisać. – mrblippy

3

Możesz użyć strcmp() function, aby porównać struny.

Pamiętaj także o wyczyszczeniu pamięci wskazywanej przez word3 przy użyciu funkcji free() przed zakończeniem.

+0

Dzięki, w jaki sposób mogę użyć strcmp na trzech ciągach? przepraszam, jestem nowy w tym – mrblippy

0

Oto program zawierający kod do pobrania podciągu z ostatnich 4 znaków najmniejszego słowa. Naprawiono również błąd, w którym word3 był zawsze ustawiony na ostatnie słowo wejściowe (buffer), a nie smallestword zgodnie z przeznaczeniem.

#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

chciałbym generalizować, budowanie tablicę wskaźników i sortowanie to z algorytmu sortowania bąbelkowego minimalny (lub przy użyciu qsort w stdlib, lepiej odkąd nie extracode), jeśli w porządku rosnącym, a następnie pierwszy wskaźnik wskazuje na ciąg, którego potrzebujesz. Nawet jeśli to praca domowa, myślę, że powinieneś generalizować (co, jeśli słowa są 4, lub 5 ...?) I nauczyć się uogólniać takie zadania.

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 jest opakowaniem, które dereference ze wskaźników, gdyż przechodzi qsort wskaźniki do obiektu (które są wskaźnikami ...):

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

(możliwe są zbyt leniwi ostrzeżenia aby sprawdzić teraz ...)

0

Jeśli chcesz posortować ciągi, to najpierw zapisz je w tablicy i wykonaj Bubble Sort. Możesz również użyć tego algorytmu do sortowania ciągów na połączonej liście.