Как поменять местами массив символов из второго массива в последний второй массив

#c

#c

Вопрос:

Поменяйте местами 2 первых символа на предпоследний символ и так далее, например, 3 первых символа на третий последний символ, пока символ не дойдет до середины слова.

Ввод:

 I love programming
  

Вывод:

 i lvoe pnimmargorg
  

Я пытался сделать

     #include <stdio.h>
#include <string.h>
int main(){
    int t;
    scanf("%d",amp;t);
    char s[105 t];
    getchar();
    for(int i=0;i<t;i  ){
        scanf("%[^n]",s);
        int len  = strlen(s);
        char temp[105 t];
        getchar();
        for(int i=0;i<len/2;i  ){
            strcpy(temp,s);
            s[i] = s[len-i-1];
            s[len-i-1] = temp;
        }
            for(int i=0;i<len/2;i  ){
                printf("%c",s[i]);
        }
    }
    
    

    return 0;
}
  

Комментарии:

1. Что вы пробовали?

2. Что такое «последний второй массив»? Я не понимаю вопроса.

3. О, я вижу, вопрос был предан забвению OP. Попытается спасти с помощью отката. Все еще не уверен, можно ли сохранить это сообщение.

Ответ №1:

Это должно быть сделано для замены

 for(int i=0;i<len/2;i  )
{
    temp = s[i];
    s[i] = s[len-i-1];
    s[len-i-1] = temp;
}
  

Комментарии:

1. s[len-i-1] = temp; недопустимо, я думаю, он должен использовать strcpy или что-то в этом роде, но он не работает с strcpy

2. пожалуйста, поделитесь полным кодом, который работает с 1D char массивом

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

4. Это меняет местами первый и последний байты слова, когда их следует оставить в покое.

Ответ №2:

Есть несколько способов подойти к этому. Ключ в том, что вы хотите иметь возможность находить начало и конец каждого слова в строке. (на самом деле 2-й и предпоследний символ в каждом слове). Вы не можете использовать strtok() или strsep() , поскольку оба пишут символы, заканчивающиеся нулем, вместо разделителей в вашей строке. Что вам нужно, так это какой-то способ вручную продвигаться по вашей строке, чтобы найти начало и конец каждого слова.

Один из способов — использовать пару указателей и вложенных циклов, при этом внешний цикл продвигает начальный указатель до тех пор, пока не будет найдено начало следующего слова. Затем установите указатель конца равным указателю начала и выполняйте цикл с вложенным циклом, перемещая указатель конца до тех пор, пока не будет найден следующий пробел или конец строки. Вы знаете, что между двумя указателями будет ваше слово.

Переместите начальный указатель на единицу до 2-го символа и уменьшите конечный указатель на два, чтобы найти предпоследний символ (вы вычитаете единицу 2 , потому что в данный момент вы указываете на следующий пробел после слова — чтобы найти последний символ, а затем снова вычтите для предпоследнего символасимвол)

Другой вариант — использовать strspn() и strcspn() заменить вложенные циклы. strspn() возвращает количество крайних левых символов в строке, состоящей только из символов в параметре accept (используется " tn" для пропуска пробелов в начале следующего слова) и strcspn() которая возвращает самое левое количество символов, не включая символы в параметре reject . (используйте то же " tn" самое, чтобы заставить его пропустить все символы в работе до следующего пробела, возвращая длину слова).

Написание простой функции для применения логики к каждому слову в данной строке и переключение со 2-го на предпоследний символ в каждом слове может быть выполнено следующим образом:

 char *outsidein (char *s)
{
    char *p = s;        /* pointer to position in s to work toward end */
    
    while (1) {
        size_t  offset = strspn (p, " tn"),               /* find 1st non-space */
                length = strcspn (p   offset, " tn");     /* find next space */
        if (!length)                                        /* at end, break */
            break;
        char *sp = p   offset   1,              /* start pointer to 2nd char in word */
             *ep = p   offset   length - 2;     /* end pointer to next to last char */
        while (sp < ep) {                       /* loop toward middle */
            int tmp = *ep;                      /* swap chars at sp amp; ep */
            *ep-- = *sp;
            *sp   = tmp;
        }
        p  = offset   length;       /* update pointer to space following word */
    }
    
    return s;       /* for convenience, return a pointer to s for immediate use */
}
  

(примечание: строка, передаваемая в качестве параметра s , должна быть изменяемой строкой)

Выше указатель p перемещается вниз по строке, сохраняя начальное местоположение каждого слова, а затем количество пробелов ( offset ) и length добавляется к нему для перехода к следующему пробелу после слова, которое вы обработали.

Короткий пример программы, которая помещает его в целом, может быть:

 #include <stdio.h>
#include <string.h>

#define MAXC 1024       /* if you need a constant, #define one (or more) */

char *outsidein (char *s)
{
    char *p = s;        /* pointer to position in s to work toward end */
    
    while (1) {
        size_t  offset = strspn (p, " tn"),               /* find 1st non-space */
                length = strcspn (p   offset, " tn");     /* find next space */
        if (!length)                                        /* at end, break */
            break;
        char *sp = p   offset   1,              /* start pointer to 2nd char in word */
             *ep = p   offset   length - 2;     /* end pointer to next to last char */
        while (sp < ep) {                       /* loop toward middle */
            int tmp = *ep;                      /* swap chars at sp amp; ep */
            *ep-- = *sp;
            *sp   = tmp;
        }
        p  = offset   length;       /* update pointer to space following word */
    }
    
    return s;       /* for convenience, return a pointer to s for immediate use */
}

int main (void) {
    
    char line[MAXC];
    
    while (fgets (line, MAXC, stdin)) {         /* read each line */
        line[strcspn (line, "n")] = 0;         /* trim n character from end */
        printf ("%sn", outsidein (line));      /* output modified line */
    }
}
  

Пример использования / вывода

 $ echo "I love programming" | ./bin/str_outsidein
I lvoe pnimmargorg
  

Есть несколько способов сделать это. Просмотрите все и дайте мне знать, если у вас есть вопросы.

Ответ №3:

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

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

  • несколько пробелов между словами.
  • входные строки, начинающиеся с пробелов.
  • входные строки, заканчивающиеся пробелом.

Смотрите комментарии в коде ниже.

 #include <stdio.h>
#include <string.h>

void scramble(char* str)
{
    char *p, *q, *word_start;
    char c;
    
    if (str == NULL)
        return;
    
    while (*str != 0)
    {
        // skip spaces, you could also use while (isspace(*str amp; 0xFF))
        // which would suddenly make this function much more 
        // versatile and interesting.  
        while (*str == ' ')
              str;

        // keep track of the start of the word
        word_start = str;

        // find end of word, you could also use isspace() here,
        // if you decide to go that route.
        while (*str != ' ' amp;amp; *str != 0)
              str;
            
        // str now points to one character past the last char of word  
            
        // swap the letters we want, from second to second to last,
        // leave the others untouched.  Note that the p < q test
        // automatically skips processing of words of 3 bytes or less.
        // so this takes also care of strings ending with a space
        // which ould give us an empty word (when str == word_start)
        for (p = word_start   1, q = str - 2; p < q;   p, --q)
        {
            c = *p;
            *p = *q;
            *q = c;
        }
    }
}

const char input_string[] = "I love programming";

int main()
{
    char output_string[sizeof(input_string)];

    strcpy(output_string, input_string);

    printf("input:  %sn", input_string);

    scramble(output_string);

    printf("output: %sn", output_string);

    return 0;
}
  

Попробуйте и выполните следующие действия: https://onlinegdb.com/SkxKerFYP