Первый символ в обеих строках не поменяется местами в 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];
}
}