Для начала scanf("%c")
получает один символ, не строку. Для этого вы должны использовать fgets
, например:
fgets (plural, SIZE, stdin);
if (buffer[strlen(buffer)-1] == '\n') // Remove newline if there.
buffer[strlen(buffer)-1] = '\0';
Как только вы исправите это, мы можем перейти к функции, которая множит слова вместе с приличным тестовым набором. Убедитесь, что у вас есть собственный main
(с фиксированным методом ввода), поскольку в этом жгуте есть пара вещей, которые, вероятно, заставят вашего преподавателя подозревать, что это не ваш код. Я просто включил его для наших целей тестирования здесь.
Начните с чего-то вроде:
#include <stdio.h>
#include <string.h>
char *pluralise(char *str) {
static char buffer[4096];
strcpy (buffer, str);
return buffer;
}
int main(void)
{
char *test[] = {
"chair", "dairy", "boss", "circus", "fly",
"dog", "church", "clue", "dish"
};
size_t i;
for (i = 0; i < sizeof(test)/sizeof(*test); i++)
printf ("%-8s -> %s\n", test[i], pluralise (test[i]));
return 0;
}
Это просто возвращает вам именно то, что вы прошли, но это хорошее начало:
chair -> chair
dairy -> dairy
boss -> boss
circus -> circus
fly -> fly
dog -> dog
church -> church
clue -> clue
dish -> dish
Следующим шагом является понимание того, как определить конкретное окончание и как скопировать и изменить строку в соответствии с требованиями.
Строка представляет собой массив символов вида:
0 1 2 3 4 5
+---+---+---+---+---+---+
| c | h | a | i | r | $ |
+---+---+---+---+---+---+
где $
представляет нулевой терминатор \0
. Числа выше дают смещение от начала или индекс, который вы можете использовать, чтобы получить символ из определенной позиции в этом массиве. Так что str[3]
даст вам i
.
Используя это и длину строки (strlen(str)
даст вам 5), вы можете проверить определенные символы. Вы также можете скопировать символы в целевой буфер и использовать аналогичный метод, чтобы изменить конец.
Как и любой хороший наркоторговец, я собираюсь дать вам первый удар бесплатно: -)
char *pluralise(char *str) {
static char buffer[4096];
size_t sz = strlen (str); // Get length.
if (sz >= 1) { // Only try this if long enough.
if (str[sz-1] == 'y') { // Is last character 'y'?
strcpy (buffer, str); // Yes, copy whole buffer.
strcpy (&(buffer[sz-1]), "ies"); // Overwrite from last character.
return buffer; // Return it.
}
}
strcpy (buffer, str); // If none match,
strcat (buffer, "s"); // just add "s"
return buffer; // and return it.
}
Особый интерес представляет последовательность:
strcpy (buffer, str);
strcpy (&(buffer[sz-1]), "ies");
Первая строка создает точную копию строки, например:
0 1 2 3 4 5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+
Вторая строка копирует строку "ies"
в ячейку памяти buffer[sz-1]
. Поскольку sz
равно 5, это будет смещением 4, что приведет к следующему изменению:
0 1 2 3 4 5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+---+---+
| i | e | s | $ |
+---+---+---+---+
так что в итоге вы получите dairies
.
Исходя из этого, вы должны иметь возможность использовать те же методы для обнаружения других концов строк и выполнять аналогичные операции копирования / изменения для правильного множественного распределения строк.