反向字符串功能无法正常工作

时间:2015-12-17 09:49:11

标签: c string reverse

这是我的代码。我似乎无法弄明白。有时我没有输出,有时我只得到3个随机字符,无论输入的字符串有多长。

typedef

我真的很害怕在这里提出这些问题,但我似乎无法解决这个问题...... 任何帮助表示赞赏

5 个答案:

答案 0 :(得分:1)

从概念上讲,您需要交换两端,直到留下长度为0或1的字符串。但是,每次迭代后都不需要测试字符串剩余部分的长度,因为它可以显示length/2掉期。

void swap_char (char *a, char *b)
{
    char tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;
}

void reverse (char *s)
{
    size_t length = strlen (s);

    for (size_t i = 0; i < length / 2; i++) {
        swap_char (&s[i], &s[length - i - 1]);
    }
}

答案 1 :(得分:0)

没有必要让这样的事情复杂化,试试这个:

#include <stdio.h>

int main(void){
    char *src = "Michi";
    char dest[256];
    int i=-1,j=0;

    while(src[++i]!='\0');

    while(i>=0){
        dest[j++] = src[--i];
    }

    dest[j]='\0';
    printf("Your new string is: %s",dest);

    return 0;
}

输出:

Your new string is: ihciM

这可能就是你所需要的:

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

void reverse(char *ptr);


int main(void) {
    char src[256] = "Michi";
    reverse(src);

    printf("Your new string is: %s",src);
    return (0);
}

void reverse(char *src){
    char dest;
    size_t i, j = 0;

    i = 0;
    j = strlen(src) - 1;

    while (i < j) {
        dest = src[i];
        src[i] = src[j];
        src[j] = dest;
        i++;
        j--;
    }
}

答案 2 :(得分:0)

不要使用gets(),请使用fgets()。要反转字符串,您不需要传递字符数,因为C中的字符串是空终止的。检查这个非常简单的函数:

#include <stdio.h>

void reverse(char *_Str);

int main(void)
{
    char str[] = "Hello Buddy";
    reverse(str);
    printf("%s\n",str);
    return 0;
}

void reverse(char *_Str)
{
    char tmp,*_b,*_e;
    _b = _e = _Str;
    while(*_e) _e++;
    _e--;
    while(_b < _e)
    {
        tmp = *_b;
        *_b++ = *_e;
        *_e-- = tmp;
    }
}

答案 3 :(得分:0)

你错过的非常重要的一行是分配空字符。并且不要将字符串的长度作为用户的输入。使用函数some_integer=strlen(stringname);这将返回stringname的长度并将其分配给some_integer。你的反转字符串的功能应该是

void reverse(char *userarray) // no need of a second argument. Do not trust your users.
{
    char temp;
    int fromEnd,fromStart = 0; /
    fromEnd = strlen(userarray)-1; // here the length of your string is assigned to fromEnd.
    while (fromStart < fromEnd)
    {
        temp = userArray[fromStart];
        userArray[fromStart] = userArray[fromEnd];
        userArray[fromEnd] = temp;
        fromStart++;
        fromEnd--;
    }
    userarray[strlen(userarray)-1]='\0'; //You missed this line (very important)
}

谢谢你的printf陈述。

应该是

printf("Your reversed string is %s \n",string);

printf("Your reversed string is %s \n"),string;

我相信这会奏效。检查一下,让我知道它是否适合您。

答案 4 :(得分:0)

代码不正确。 printf()所需的字符串不在函数中。 @M Oehm

/// printf("Reversed string is: %s\n"), string;
printf("Reversed string is: %s\n", string);

原始代码也可以轻松消除终止空字符'\0'的字符串。最好使用strlen(string)而不是询问用户的长度。

可能会使用- 1评论@WalterM。目前还不清楚OP正在使用什么价值。

// fromEnd = numberOfChars;
if (numberOfChars <= 0) return;
fromEnd = numberOfChars - 1;

我到目前为止看到的答案依赖于int很好地解决字符串的所有元素。 size_t是正确的方法,因为int可能太小。

许多答案都会在""等字符串上失败。

所以这是没有这些限制的另一个贡献。

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

char *str_revese_inplace(char *s) {
  char *left = s;
  char *right = s + strlen(s);
  while (right > left) {
    right--;
    char t = *right;
    *right = *left;
    *left = t;
    left++;
  }
  return s;
}

void stest(const char *s) {
  char t[strlen(s) + 1];
  // or char t[100];
  strcpy(t, s);
  printf("'%s' --> '%s'\n", s, str_revese_inplace(t));
}

int main(void) {
  stest("123");
  stest("12");
  stest("1");
  stest("");
  return 0;
}

输出

'123' --> '321'
'12' --> '21'
'1' --> '1'
'' --> ''