C-строка

Мне было поручено в школе написать программу, которая

  • Считывает три строки
  • Сохраняет третью строку в динамически распределенной памяти
  • Распечатайте последние 4 буквы первого слова в алфавитном порядке.

Вот программа, которую я имею до сих пор. Строки хранятся в разных переменных, что затрудняет их сортировку. Если бы кто-нибудь мог дать мне руку и помочь мне закончить эту программу, я был бы очень благодарен.

#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;
}

Ответы

Ответ 1

Вы можете использовать strcmp() function для сравнения строк.

Кроме того, не забудьте очистить память, указанную word3, с помощью функции free() до того, как вы закончите.

Ответ 2

Используйте 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;
}

Ответ 3

Здесь программа включает код, чтобы получить подстроку из последних 4 символов наименьшего слова. Также исправлена ​​ошибка, в которой word3 всегда был установлен на последний ввод слова (buffer), а не 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; 
}

Ответ 4

Я бы обобщил, построив массив указателей и отсортировав его с помощью минимального алгоритма сортировки пузырьков (или используя qsort в stdlib, лучше, поскольку вы не должны экстракодировать), если в порядке возрастания, тогда первый указатель указывает на строка, в которой вы нуждаетесь. Даже если это домашнее задание, я думаю, вы должны обобщить (что, если слова 4 или 5...?), И научиться обобщать такие задачи.

 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.

ИЗМЕНИТЬ

mwstrcmp - это оболочка, которая разыгрывает указатели, поскольку qsort передает указатели на объект (которые являются указателями...):

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

(предупреждения могут быть слишком ленивы, чтобы проверить сейчас...)

Ответ 5

Если вы хотите отсортировать строки, сначала сохраните их в массиве и сделайте Bubble Sort. Вы также можете использовать этот алгоритм для сортировки строк в связанном списке.