簡體   English   中英

如何使用C反轉字符串?

[英]How to reverse string using C?

我想反轉C語言中的字符串。 我有點新,所以我很想獲得幫助和解釋。 為什么我的解決方案不起作用?

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

char *rev(char *str) {
  char *q = str;
  int len = strlen(str);
  char *p = (char*)calloc(len+1, sizeof(char));
  int j=0;
  if (NULL == str || len == 1) return str;
  for (j = len+1 ; j > 0 ; j-- ) {
    p[j]=*q;
    q++;
  }
  return p;
}

int main(int argc, char **argv){
  char *t = argv[1];
  char *p ;
  printf("%s",t);
  p=rev(t);
  printf("%s",p);
  getchar();
  return 0;
}

它不起作用:(

首先,您很聰明地使用calloc來確保結果緩沖區的末尾為零。

但這也將零開頭!

循環終止條件是j > 0這意味着您永遠不會在結果中填充插槽0。

因此,當您嘗試打印p ,緩沖區中的第一個字符指向一個\\0標記字符串的結尾,因此結果始終是空字符串

我在http://codepad.org/QppfYQkm上做了一些“修復”(我沒有更改格式,並且對參數進行了硬編碼,因此它是獨立的。)

撇開:我刪除了您檢查if (len == 1) return str 不要這樣做! 如果您使用一個字符的字符串,則將返回與保存參數的緩沖區相同的緩沖區,這意味着更改該結果將破壞您的輸入。 將這些緩沖區分開。

你真的很親近 :)

附錄

這是一些使用命令行參數的代碼:

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

char *rev(char *str) {
  char *q = str;
  int len = strlen(str);
  char *p = (char*)calloc(len + 1, sizeof(char));
  int j;

  if (NULL == str) return NULL;

  for (j = len-1 ; j >= 0 ; j--) {
    p[j] = *q;
    q++;
  }
  return p;
}

int main(int argc, char **argv) {
  if (argc > 1) {
    char *t = argv[1];
    char *p ;

    printf("%s\n",t);
    p = rev(t);
    printf("%s\n",p);

    return 0;
  }
}

當我運行它時:

$ gcc rev.c && ./a.out "hello there, reverse me"
hello there, reverse me
em esrever ,ereht olleh
$ gcc rev.c && ./a.out ""


$ gcc rev.c && ./a.out
$

該程序可以很好地處理文本和空字符串。 沒有給出任何參數時,它默默地不執行任何操作。

您必須小心邊界處的索引。

一種解決方法是用以下代碼替換for行:

for (j = len-1; j >= 0 ; j-- )

您需要迭代列表的一半以上(四舍五入,如果中間字符是奇長字符串,則不能反轉中間字符),然后通過一個臨時變量進行交換。

您正在寫一半以上的字符串,因為您沒有使用臨時變量。 嘗試類似:

for( j = 0; j < len / 2; ++j ) {
    char tmp = p[ j ];
    p[ j ] = p[ len - j - 1 ];
    p[ len - j - 1 ] = tmp;
}

編輯:這樣做就位; 如果將其放入另一個緩沖區,則需要添加p [len] = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM