【问题标题】:looking for efficient swap char pointer寻找有效的交换字符指针
【发布时间】:2014-12-10 18:07:05
【问题描述】:

我的问题是关于交换字符指针算法的效率。

为什么任何一个注释行都会导致我的编译器抛出错误?

同样的逻辑适用于将 b 与 temp 交换,但同样的逻辑在对 temp 和 a 重复相同的函数时会导致错误?

谢谢大家。

#include <iostream>
void sawp ( char *a, char *b, int l)
{
    char * prtA = a;
    char * prtB = b;
    char *temp = (char *)calloc(l, sizeof(char));

    while(*(char*)b)
    {        
        *(char*)temp= *(char*)b;
        // *(char*)b  = *(char*)a;
        // *(char*)a = *(char*)temp;

        std::cout<<*(char*)temp<<std::endl;
        b++;
        temp++;
        a++;    
    }

}

int main()

{
    char *a="Name";
    char *b="Lastname";
    sawp (a,b,sizeof(b));
    return 0;

}

【问题讨论】:

  • 旁注#1:那些(char*) 铸件是完全多余的——您将char* 铸件到char*。旁注#2:您将swap 拼错为sawp。旁注#3:你没有对prtAprtB 做任何事情。旁注#4:您将“编译器”拼错为“编译器”。所有这些附注只是为了告诉您,在此处发布问题之前您应该付出一点努力(也就是说,如果您希望其他人努力回答它)。重要说明 #1:“抛出错误”的不是编译器,因为它不是编译错误——它是运行时错误!!!

标签: c pointers embedded swap


【解决方案1】:

修改字符串文字会导致未定义的行为。 它可能会导致崩溃。 字符串文字是只读的,因此不能修改。

所以

*b = *a;

是一个错误。

如果你想修改你的字符串,那么他们应该有读写权限。 所以

char a[10] = "name1";
char b[10] = "name2";

那么你就可以拥有了

*b = *a; /* In your sawp() function */

【讨论】:

    【解决方案2】:

    编写char *a="Name" 编译器会将"Name" 字符串视为常量字符串并将其放置在rom 内存部分中。 rom内存段是只读段,代码在运行时无权修改,修改时会报段错误。

    【讨论】:

      【解决方案3】:

      你看过这篇文章了吗? Swapping pointers in C (char, int)

      最后,有一个关于如何交换字符的解释。也许它适合你。

      【讨论】:

        【解决方案4】:

        为避免 Gopi 发布的文字问题,您可以在 main 中使用字符数组而不是指针,并确保它们的大小相同,例如:

        char a[10] = {'N','a','m','e',0,0,0,0,0,0};
        char b[10] = {'L','a','s','t','n','a','m','e',0,0};
        /* ... */
            sawp(a, b, sizeof(b));
        

        或者如果您仍然想使用指针,您可以使用 malloc()(假设这是 C 而不是 C++)为字符串分配空间,然后将文字复制到您分配的字符串中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-22
          • 1970-01-01
          • 2020-02-01
          • 2016-06-02
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          • 2019-01-06
          相关资源
          最近更新 更多