【问题标题】:Swap chars only given pointer [duplicate]仅给定指针交换字符[重复]
【发布时间】:2012-10-13 15:53:55
【问题描述】:

可能重复:
Why do I get a segmentation fault when writing to a string?

如果我有一个指针并且我知道两个字符的索引,我将如何交换字符(我实际上并没有分配一个数组)

char *str = "hello" 我知道并且我想交换索引 0 和 4 的“h”和“o”,然后也返回指针。

我习惯了

temp = array[i];
array[i] = array[j];
array[j] = temp;

【问题讨论】:

  • 不清楚你在问什么。

标签: c string pointers swap


【解决方案1】:

好吧,你不能使用指向字符串文字的指针。字面量是不可变的。坚持你一直做的方式。

【讨论】:

  • 那么,如果给我一个指向字符串文字的指针,我必须将它复制到 char 数组中?
  • 是的,然后你可以交换它。你试过了吗?你应该得到一个段错误。
  • 正是我遇到了段错误,这就是我感到困惑的原因!
  • 是的,无论如何,您问题的评论框中的某些链接应该会有所帮助;)尝试更改只读内存位置的内容并不好! :P
【解决方案2】:

以下声明:

char *str = "hello";

应该是,警告你不安全的行为:

const char *str = "hello";

因为根据 C 标准,尝试修改字符串是一种未定义的行为,所以您应该使用数组。

char str[] = "hello";

那么,交换数组的元素既简单又安全:

char tmp = str[0];
str[0] = str[4];
str[4] = tmp;

【讨论】:

    【解决方案3】:
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    

    【讨论】:

    • 但我从来没有说过 char[] s = {'h','e' ....};我怎么能这样呢?
    • char* foo = "bar";等于 char foo[] = {'b','a','r','\0' };
    • 不相等。不同的类型,不同的行为。
    • 对不起,我一定是c新手,你能帮我解释一下这两个char指针之间的区别吗?
    【解决方案4】:

    某些操作系统/编译器允许您修改字符串文字,主要是 AIX 5.1。

    如果修改代码中的字符串文字,让代码跨平台变得很痛苦,因为您必须重写代码才能为 Linux 编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2013-09-09
      • 2021-02-11
      相关资源
      最近更新 更多