Во-первых, вы не хотите использовать gets
. Он был удален из стандартной библиотеки, потому что он был небезопасным, вместо этого используйте fgets
. При этом все, что вам нужно сделать, это токенизировать вашу входную строку в слова, а затем, если слово больше 3 символов, замените второй и следующий символы последними. Один из способов будет:
#include <stdio.h>
#include <string.h>
#define MAXS 256
#define MAXW 64
int main (void) {
size_t len;
char str[MAXS] = {0};
char word[MAXW] = {0};
char *p = NULL;
fgets (str, MAXS, stdin); /* read input from stdin */
/* tokenize string */
for (p = strtok (str, " "); p; p = strtok (NULL, " \n"))
{
strncpy (word, p, MAXW - 1); /* copy token to word */
if ((len = strlen (word)) > 3) /* if word > 3 */
{
char tmp = word[1]; /* swap 2nd & next to last */
word[1] = word[len-2];
word[len-2] = tmp;
}
printf ("%s ", word);
}
putchar ('\n');
return 0;
}
Использование/выход
$ printf "Alex are mere\n" | ./bin/swap2nd
Aelx are mree
или если вы хотите, чтобы ввести текст:
$ ./bin/swap2nd
Alex are mere
Aelx are mree
Второй метод с использованием Start/End указателей
Вы можете также изменить исходную строку готовую Ве fgets
на месте, используя не более чем запуска указателя (p
ниже) и конец указателя (ep
ниже), чтобы работать ваш путь вниз строки символ за символом, останавливаясь каждый раз конец указатель указывает на space
, tab
или newline
, а затем, используя разницу между начала и конечных указателей, чтобы проверить длину слова и выполнять своп символов, если длина больше 3 символы. Вы можете работать по каждой версии и сравнить:
#include <stdio.h>
#define MAXS 256
int main (void) {
char str[MAXS] = {0};
char *p = NULL;
char *ep = NULL;
fgets (str, MAXS, stdin); /* read input from stdin */
p = ep = str;
while (*ep) /* for each char, if a space, tab or newline */
if (*ep == ' ' || *ep == '\t' || *ep == '\n') {
if ((ep - p) > 3) { /* if length > 3 */
char tmp = *(p + 1); /* swap chars */
*(p + 1) = *(ep - 2);
*(ep - 2) = tmp;
}
p = ++ep; /* set p to next word */
}
else
++ep;
printf ("%s\n", str);
return 0;
}
Использование/выход
$ ./bin/swap2nd2
Alex are mere
Aelx are mree
Какой подход вам сделать выбор между этими двумя методами, а также методом, публикуемую Влад, во многом дело вкуса/выбора. Все они являются действительными и представляют собой просто другой способ выполнения одного и того же. Дайте мне знать, если у вас есть вопросы.
Я должен «* поменять 2-й символ следующим последним» - это более простой способ формулировки вопроса. –
FIrst разделяет полное предложение словом и после этого проверяет каждую длину слова больше трех, а затем заменяет caharcter. –
'strlen (cuv) - 1;' не будет работать - 'cuv' не заканчивается нулем. – Downvoter