微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用指针索引尝试反转 c 中的字符串

如何解决使用指针索引尝试反转 c 中的字符串

void funrev( char * str)
{

    int n = strlen(str);
    char *ptr2  = (char*)malloc( n +1);
    char* ptr = ptr2;
    while( *str)
    {
        str++;
    }
    int i;
    for(i =0; i <=n ; i++)
    {
        *(ptr++) = str[--n];
    }
    *ptr = '\0';
    printf(" rev %s",ptr2);
}

我正在尝试使用指针索引反转字符串,使用索引递减指针并分配给指针。请指出这有什么问题。

解决方法

您正在将 str 指针移动到字符串的末尾:

while( *str) {
  str++;
}

然后索引过去:

  *(ptr++) = str[--n]

这个字节 str[--n]n-1 个字符传递给结尾 str,这可能不是你想要的。这里也有其他错误,比如您减少 n 增加 i,这也可能不是您想要的。

您的代码的工作版本可能如下所示:

void funrev(const char *str)
{
  int n = strlen(str);
  char *reversed = malloc(n + 1);
  const char *end_of_str = str + n;

  for (size_t i = 0; i < n; i++)
    reversed[i] = *(--end_of_str);

  reversed[n] = 0;
  printf("rev %s\n",reversed);
  free(reversed);
}
,

您需要创建本地版本吗?您正在返回 void,所以我假设您想要反转 str,这可能比您正在做的更清楚。它使用 char 来交换前导和尾随字符。

void funrev(char* str)
{
    size_t len = strlen(str);

    if (len < 2)
    {
        return;   /* nothing to do */
    }

    char *lp = str;             /* pointer to lead character */
    char *tp = str + len - 1;   /* pointer to tail character */
    char swap;
    size_t loops = len / 2;     /* fractional part is truncated */

    for (size_t loop = 0; loop < loops; loop++)
    {
        swap = *lp;     /* swap */
        *lp = *tp;
        *tp = swap;
        lp++;           /* increment lead pointer */
        tp--;           /* decrement tail pointer */
    }

    return;
}
,
void funrev( char * str)
{

int n = strlen(str);
char *ptr2  = (char*)malloc( n +1);
char* ptr = ptr2;
while( *str)  
{
str++;  // error1: moving str pointer..; why is the requirement for this?
}
int i;
for(i =0; i <=n ; i++)
{
*(ptr++) = str[--n]; // error2: wrong use of n variable,decrementing n will effect the loop..
}
*ptr = '\0';
printf(" rev %s",ptr2);
}

你可能需要这个......

int funrev( char * str)
{

int n = strlen(str);
char *ptr2  = (char*)malloc( n +1);
char* ptr = ptr2;
if(!(*str)) // error handling
{
printf("null string: nothing to reverse!\n");
return -1;
}
int i,lastindex = n; //edit...
for(i =0; i <=n ; i++)
{
*(ptr+i) = str[lastindex--]; //edit...
}
*(ptr+i+1) = '\0'; //edit...
printf(" rev %s",ptr2);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。