交换字符指针

时间:2015-10-22 18:47:14

标签: c

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

void* swap(void* x, void* y, int size)
{
    char* buffer[size];
    memcpy(buffer,x,size);
    memcpy(x,y,size);
    memcpy(y,buffer,size);

}

int main()
{
    char* wife = strdup("Wilma Deloitte");
    char* husband = strdup("Fred");
    printf("\n wife : %s husband : %s \n",wife,husband);
    swap(wife,husband,sizeof(char*));
    printf("\nAfter swap: \nwife : %s husband : %s \n",wife,husband);
    printf("\n sieof : %d \n",(int)sizeof(char*));
    return 0;
}

输出:

     wife : Wilma Deloitte husband : Fred 

交换后:

     wife : Fred husband : Wilma De 

     sieof : 8 

如果我通过&amp; wife和&amp;丈夫,那么丈夫和妻子内部的地址会被交换,因此我得到了正确的输出与fred和wilma deloitte字符串交换..因为妻子和丈夫的字符串指着fred和wilma deloitte的地址...

我已通过丈夫和妻子内部的地址通过memcpy交换..我想在fred和wilma deloitte之间交换5个字母(因为“fred \ 0”是5个字符)..所以以上输出必须是Fred Deloitte和Wilma ..为什么输出不如预期..

4 个答案:

答案 0 :(得分:4)

您正在交换由sizeof(char*)确定的字节数。

在您的平台上,sizeof(char*),实际上, ANY 指针的大小始终为8个字节。

sizeof不是测量字符串的工具。如果您要测量字符串的长度,则应使用strlen,而不是sizeof

如果您只想换掉他们的名字,请试试这个:

swap(wife,husband,sizeof(husband)+1); // Swap 5 characters

void* swap(void* x, void* y, int size)
{
    char buffer[size];
    memcpy(buffer,x,size);  // Buffer is now "Wilma " (no NULL-terminator)
    memcpy(x,y,size);       // x is now "Fred Deloitte"
    memcpy(y,buffer,size);  // y is now "Wilma" (no NULL-terminator)
}

注意关于NULL终止符的注释 它更好,但并不完美。

如果您打算交换整个文本,请认识到wife包含15个字符,但husband仅包含5个字符。您如何建议将15个字符的数据填充为5个字符的数组?

如果您使用字符串,我建议使用与字符串相关的函数:strlenstrcpystrcat,而不是mem - 函数

答案 1 :(得分:3)

改变这个:

char* buffer[size];

对此:

char buffer[size];

并改变这一点:

swap(wife,husband,sizeof(char*));

对此:

swap(&wife,&husband,sizeof(char*));

答案 2 :(得分:1)

swap(wife,husband,sizeof(char*));

当您发送sizeof(char*)作为大小时,它会创建4大小的缓冲区,这就是为什么只交换了四个chars的原因。

应该如下:

int size = strlen(wife)>strlen(husband) ? strlen(wife) : strlen(husband);
swap(wife,husband, size);
# maximum size

答案 3 :(得分:1)

最重要的是,我认为您的意图是将一个 动态分配的 字符串的内容与另一个动态分配的字符串的内容进行交换。那是错的。在示例程序中,您尝试将15字节字符串(&#34; Wilma Deloitte \ 0&#34;)复制到5字节strdup() / malloc() ed字符串(包含内存) &#34;佛瑞德\ 0&#34)。一旦你解决了其他人提到的问题,你仍然会遇到 破坏内存堆 的问题(取决于malloc()实现)。