繁体   English   中英

在 C 中使用指针反转字符串

[英]Reverse string with pointers in C

我尝试了以下两种方法来使用字符指针反转 C 中的字符串:

选项1:

void stringreverse(char *s){
    int n = stringlength(s) - 2;

    while(*s != '\0'){
        char c = *s;
        *s = *(s+n);
        *(s+n) = c;
        s++;n--;
    }       
}

选项 2:

void stringreverse(char *s){
    char *p = s + stringlength(s) - 2;

    while(*s != '\0'){
        char c = *s;
        *s = *p;
        *p = c;
        s++,p--;
    }   
}

以上都不起作用。 提示为什么?

问题是您的代码反转字符串然后再次反转它,因为您的循环从 0 到 len(当 *s==\\0 时),它应该在 (len-1)/2 处停止

你应该试试这个:

void stringreverse(char* s){
  int len = strlen(s)-1;
  int i;
  for(i=0;i<len/2;i++){
    char tmp = s[i];
    s[i] = s[len-i];
    s[len-i]=tmp;
  }
}

要反转字符串,您应该在字符串的开头和结尾之间交换字符,直到它们在中间相遇,您所做的方式将反转它,然后再次将其反转为原始字符串。 标准C中也有strlen 。无论如何使用你对stringlength的定义,它应该是:

void stringreverse(char *s){
    int n = stringlength(s) - 2;
    int i;
    while(i = 0; i < n / 2; i++) {
        char c = s[i];
        s[i] = s[n-i];
        s[n-i] = c;
    }       
}

使用指针完成工作示例:

#include <stdio.h>    
void reverse(char *p){
    char c;
    char* q = p;
    while (*q) q++;
    q--; // point to the end
    while (p < q){
        c = *p;
        *p++ = *q;
        *q-- = c;
    }
}

int main(){
    char s[] = "DCBA";
    reverse(s);
    printf("%s\n", s); // ABCD
}

p:指向字符串的开头。
q:指向字符串的结尾。
然后交换它们的内容。
简单易行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM