两个字符串中的第一个字符不会在C中交换

时间:2017-11-01 10:40:12

标签: c string swap s

#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];
    }
}

当我向string1string2提供输入时,请说"yes""hello",它将打印string1yello和{ {1}}是string2。我尝试通过将hes更改为*b*[b+1]更改为*a进行修改,并获得第一个可以使用的角色,但现在第二个角色获胜了#39}。交换。

修改

此外,我还尝试过其他功能,但问题仍然存在。

*[a+1]

4 个答案:

答案 0 :(得分:1)

您的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足够临时。
  • 您需要访问输入ab的不同字符,而不仅仅是第一个字符。

BTW:这是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;
  }
}

答案 1 :(得分:1)

实际上只交换字符串的第一个字符(这在其他答案中有所说明),你不会看到这个,因为你改变了打印的顺序

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

此处您始终只是交换第一个字符,因为ab始终指向第一个元素。

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;
}

答案 2 :(得分: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];
    }
}

Output is here

答案 3 :(得分:0)

您的代码中存在多个问题:

  • 以错误的顺序打印字符串
  • 您只交换第一个字符,并执行此SIZE次。 SIZE很奇怪所以你看到它被交换了,之前的bug让它看起来像其他角色被交换了。如果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;
}