【问题标题】:In-Place String Reverse in CC中的就地字符串反转
【发布时间】:2011-06-14 17:34:00
【问题描述】:

我正在尝试学习 C 的基础知识,但我无法弄清楚为什么这段代码不起作用。 reverse() 中的 while 循环会导致总线错误。我在编程面试书中发现了几乎相同的代码作为有效的解决方案,但是我在这里看到的这个和其他类似的方法都不适用于我没有总线错误。

#include <stdio.h>

void reverse(char* str) {
 char* end = str;
 char tmp = 0;
 if(str) {
  while(*end) {
   end++;
  }
  --end;
  while(end>str) {
   tmp = *end;
   *end-- = *str;
   *str++ = tmp;
  }
 }
}

int main() {
 char* a = "12";
 puts(a);
 reverse(a);
 puts(a);

 return 0;
}

【问题讨论】:

标签: c string reverse in-place


【解决方案1】:

问题是您试图反转一个只读的常量文字字符串。将maina的声明更改为char a[] = "12";,使其改为可写的char数组

【讨论】:

    【解决方案2】:

    您正在尝试更改导致未定义行为的字符串文字。

    改变

    char* a = "12";
    

    char a[] = "12";
    

    【讨论】:

      【解决方案3】:

      因为endstr 指向同一个内存位置 -> 它们是同一个对象的两个不同名称。您可以避免使用两个变量:

      char foo[20] = "abcdefghi", tmp;
      int counter = 0, length = strlen(foo);
      
      for(counter, counter < length / 2; counter++) {
          tmp = foo[counter];
          foo[counter] = foo[length - counter];
          foo[length - counter] = tmp;
      }
      

      【讨论】:

      • “对象”?这是C! (无论如何,endstr 只针对几行代码指向同一个位置。)
      • 这缺少原位反转的要点:使用在字符串缓冲区内工作的两个指针。低级的东西,当然;但它应该是高效和快速的。
      • @ladenedge:“对象”是 C 语言标准中使用的正确词。
      • @R.:闭嘴。 “对象:执行环境中的数据存储区域,其内容可以表示值。”谢谢指正!
      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多