Первый символ в обеих строках не поменяется местами в C

#include <stdio.h>

#define SIZE 101
void swap(char *a, char *b);

int main(void) {
    char string1[SIZE];
    char string2[SIZE];
    printf("please enter string 1 :");
    scanf("%s", string1);

    printf("please enter string 2 :");
    scanf("%s", string2);

    swap(string1, string2);

    printf("string 1 is %s, string 2 is %s\n", string2, string1);
}

void swap(char *a, char *b) {    
    int i;
    char temp[101];
    for (i = 0; i < SIZE; i++) {
        temp[i] = *a;
        *a = *b;
        *b = temp[i];
    }
}

Когда я даю информацию обоим string1 а также string2 скажем "yes" а также "hello", он напечатает string1 является yello а также string2 является hes, Я пытался изменить, изменив *b в *[b+1] а также *a в *[a+1] и он заставляет первого персонажа работать, но теперь второй персонаж не поменяется местами.

РЕДАКТИРОВАТЬ

Также я пробовал другую функцию, но проблема все еще там.

void swap(char* a, char* b)
{
    char temp;
     temp=*a;
     *a=*b;
    *b=temp;
    a++;
    b++;
}

4 ответа

На самом деле меняются только первые символы ваших строк (что имеет смысл, как упоминалось в других ответах), вы этого не видите, потому что вы меняете порядок печати с помощью

printf("string 1 is %s, string 2 is %s\n", string2, string1);
                                            ^^^^^^^^^^^^^^^

Здесь вы всегда просто меняете первый символ, так как вы a а также b всегда указывать на первый элемент.

for(i=0; i<SIZE; i++)
{
    temp[i]= *a;
    *a=*b;
    *b=temp[i];
}

Вы можете использовать индекс массива

int i; char temp;
for (i = 0; i < SIZE; i++)
{
  temp = a[i];
  a[i] = b[i];
  b[i] = temp;
}

Ваш swap функция неверна:

Вот исправленная версия:

void swap(char* a, char* b)
{
  int i; char temp;
  for (i = 0; i<SIZE; i++)
  {
    temp = a[i];
    a[i] = b[i];
    b[i] = temp;
  }
}

  • тебе не нужен temp массив, только один char достаточно для временного.
  • вам нужно получить доступ к различным символам ввода a а также bи не только первый.

Кстати: вот лучшая версия swap где вы передаете размер в качестве параметра:

void swap(char* a, char* b, int size)
{
  int i; char temp;
  for (i = 0; i < size; i++)
  {
    temp = a[i];
    a[i] = b[i];
    b[i] = temp;
  }
}

В вашем коде несколько проблем:

  • вы печатаете строки в неправильном порядке
  • вы меняете только первый символ, и вы делаете это SIZE раз. SIZE странно, поэтому вы видите, что он поменялся местами, предыдущая ошибка заставляет его выглядеть так, как будто другие персонажи поменялись местами. Если SIZE даже если вы ничего не поменяете, и предыдущая ошибка позволит вам ошибочно поверить, что все в порядке...

Менее важно, но стоит упомянуть:

  • вы не проверяете возвращаемые значения scanf()
  • ты не вернешься 0 в конце main(),

Вот исправленная и улучшенная версия:

#include <stdio.h>

#define SIZE 101

void swap(char *a, char *b, int size) {
    for (int i = 0; i < size; i++) {
        char temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

int main(void) {
    char string1[SIZE];
    char string2[SIZE];

    printf("please enter string 1 :");
    if (scanf("%s", string1) != 1)
        return 1;

    printf("please enter string 2 :");
    if (scanf("%s", string2) != 1)
        return 1;

    swap(string1, string2, SIZE);

    printf("string 1 is %s, string 2 is %s\n", string1, string2);
    return 0;
}

Попробуйте использовать круглые скобки, такие как *(a+1) вместо скобки *[b+1], В вашем коде измените следующее

for(i=0; i<SIZE; i++)
{
     temp[i]= *a;
     *a=*b;
     *b=temp[i];
}

с

for(i=0; i<SIZE; i++)
{
     temp[i] = *(a+i);
     *(a+i) = *(b+i);
     *(b+i) = temp[i];
}

Финальный код здесь:

#include <stdio.h>
#define SIZE 101
void swap(char* a, char* b);

int main(void)
{
    char string1[SIZE]; char string2[SIZE];
    printf("please enter string 1 :");
    scanf("%s",string1);

    printf("please enter string 2 :");
    scanf("%s",string2);

    swap(string1, string2);

    printf("string 1 is %s, string 2 is %s\n",string1,string2);
    return 0;
}

void swap(char* a, char* b)
{    
   int i; char temp[101];
    for(i=0; i<SIZE; i++)
    {
        temp[i] = *(a+i);
        *(a+i) = *(b+i);
        *(b+i) = temp[i];
    }
}

Выход здесь

Другие вопросы по тегам