【问题标题】:How to reverse a C style string completely [closed]如何完全反转C风格的字符串[关闭]
【发布时间】:2011-08-06 02:24:58
【问题描述】:

我想完全反转 C 样式字符串(以空字符结尾),即包括空字符。

空字符应该是反转字符串中的第一个元素。

【问题讨论】:

  • 提示:C 字符串如何存储在内存中?
  • 如果 null char 是第一个,那么这意味着一个空字符串。
  • 我想这样做,因为面试时可能会问到:P.
  • 如果我想使用 char 数组而不是 char 指针怎么办...
  • 如果你在面试中被问到这个问题,我想我的回答会是最合适的。这样的问题显然是想测试你是否知道以\0开头的字符串是空的。

标签: c algorithm string pointers


【解决方案1】:

其实很简单:

char *reversed = "";

:)

'\0' 开头的 C 字符串是一个空字符串。除非您使用指针执行操作(例如添加 +1)或使用期望内存(指针+大小)而不是字符串的函数,否则 '\0' 后面的内容并不重要

如果您确实需要在'\0' 之后将真实字符串存在于内存中:使用将反转字符串写入给定内存位置(void strreverse(char *dest, const char *string))的函数。 然后这样称呼它:char dest[ENOUGH_SPACE]; dest[0] = '\0'; strreverse(dest + 1, YOUR_STRING);

【讨论】:

  • 我想过这种方法,但想知道是否存在任何其他有效的方法/替代方案:(
  • 这样你就需要strlen(original) + 1空间。
  • 是的。 ENOUGH_SPACE 当然应该是 >= strlen(original) + 1 ;)
【解决方案2】:

对于初学者来说,反转字符串实际上是一项很好的任务,如果您还没有进行任何编程,则需要您坐在一张纸上,思考如何存储字符以及如何交换它们大约。此外,它要求您在停止时要小心,以便它适用于具有偶数和奇数字符的字符串。

那么,你为什么不自己试一试呢?

但是,我并没有真正看到反向包含空终止符的意义,它只会在与标准字符串函数一起使用时使字符串看起来为空。另外,我希望这不是小端/大端的混淆,因为字节序不适用于字符串。

【讨论】:

    【解决方案3】:

    这是另一种方式。我们获取一个指针并使其指向目标。然后将“x”放在指针指向的位置。反转你的字符串,然后将它与目标连接。现在将'\0'分配给指针指向的位置。

    WCHAR * wszStr = "Hello World";
    wcscpy_s(wszTarget,256,L"x");
    WCHAR *pTempNULL = wszTarget;
    wcscat_s(wszTarget,256,wcsrev(wszStr)/*Or Reverse you string with your algorithm*/);
    *pTempNULL = '\0';
    

    【讨论】:

      【解决方案4】:
      void memcpy_reverse (char* dest, const char* source, size_t n)
      {
        size_t i;
      
        for(i=0; i<n; i++)
        {
          dest[i] = source[n-i-1];
        }
      }
      

      【讨论】:

        【解决方案5】:

        拿字符串。将其存储在 char[] 数组中。使用 2 个索引循环遍历字符并交换它们。将其反转回字符串。

        我想我们可以在 Java 中使用类似的东西来实现它:

        public class ReverseString 
        {
            public static void main(String[] args) 
            {
                String str = "a ";
                char[] myChar = str.toCharArray();
                System.out.println(str);
                int p1 = 0;
                int p2 = myChar.length -1;
        
                while(p1<p2)
                {
                    char temp = myChar[p1];
                    myChar[p1]= myChar[p2];
                    myChar[p2] = temp;
        
                    p1++;
                    p2--;
                }
        
                str = str.copyValueOf(myChar);
        
                System.out.println(str);
            }
        }
        

        【讨论】:

        • 这个问题是关于C和C风格的字符串;例如,在这样的字符串上没有 toCharArray 方法。
        • 这个问题是关于 C 风格的字符串。现在这个问题也可以用Java来解决。事实上,这是职业杯的一个问题:破解编码面试 - 如果这是你的首选语言,它会告诉你用 Java 解决它
        • @Santanu,即使在 (Crack the Coding Interview) 一书中,这个特定的问题也是用 C 语言回答的,而其他问题是用 Java 回答的。其背后的原因是让您能够使用以空字符结尾的字符串(C 风格字符串)
        【解决方案6】:
            public static void main(String[] args) {
                String str = Generator.getSaltString();
                str += '\0';
                System.out.println("C style string to reverse: " + str + "****");
                reverse(str);
            }
        
            private static String reverse(String str) {
                int length = str.length();
                char[] chars = new char[length];
                int j = 0;
                for (int i = length - 1; i >= 0; i--) {
                    chars[j++] = str.charAt(i);
                }
                String resultStr = new String(chars);
                System.out.println("****" + resultStr + "********");
                return resultStr;
            }
        

        【讨论】:

          【解决方案7】:

          检查此 C# 代码。你可以看到这段代码在运行here

          public static string ReverseCString(string input)
          {
          
              char[] charArray = input.ToCharArray();
              Array.Reverse(charArray);
              return new string (charArray);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-16
            • 2017-01-17
            相关资源
            最近更新 更多