C 反向字符串函数工作不正常

C 反向字符串函数工作不正常,c,string,reverse,C,String,Reverse,这是我的密码。我只是想不通。有时我得不到输出,有时我只得到3个随机字符,不管输入的字符串有多长 #include <stdio.h> #include <math.h> #include <string.h> void reverse(char* array, int numberOfChars); int main() { char string[250]; int length; printf("Enter a string:

这是我的密码。我只是想不通。有时我得不到输出,有时我只得到3个随机字符,不管输入的字符串有多长

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

void reverse(char* array, int numberOfChars);

int main()
{
    char string[250];
    int length;
    printf("Enter a string: ");
    gets(string);
    printf("How long is the string:");
    scanf("%d", &length);
    reverse(string, length);
    printf("Reversed string is: %s\n"), string;

    return 0;
}

void reverse(char *userArray, int numberOfChars)
{
    char temp;
    int fromEnd = 0, fromStart = 0;

    fromEnd = numberOfChars;
    while (fromStart < fromEnd)
    {
        temp = userArray[fromStart];
        userArray[fromStart] = userArray[fromEnd];
        userArray[fromEnd] = temp;
        fromStart++;
        fromEnd--;

    }
}
#包括
#包括
#包括
无效反转(字符*数组,int numberOfChars);
int main()
{
字符串[250];
整数长度;
printf(“输入字符串:”);
获取(字符串);
printf(“字符串有多长:”);
扫描频率(“%d”和长度);
反向(字符串、长度);
printf(“反向字符串为:%s\n”),字符串;
返回0;
}
无效反向(char*userArray,int numberOfChars)
{
焦炭温度;
int fromEnd=0,fromStart=0;
fromEnd=字符数;
while(fromStart
我真的很害怕在这里问这些问题,但我似乎无法解决它。。。
从概念上讲,您需要交换两端,直到剩下长度为0或1的字符串。但是,您不需要在每次迭代后测试字符串剩余部分的长度,因为可以显示需要精确的
length/2
交换

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

    for (size_t i = 0; i < length / 2; i++) {
        char tmp;

        tmp = s[i];
        s[i] = s[length - 1 - i];
        s[length - 1 - i] = tmp;
    }
}
void reverse(字符*s)
{
尺寸和长度=标准长度;
对于(大小i=0;i
没有必要让这样的事情复杂化,试试这个:

#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;
}
这可能是您需要的:

#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--;
    }
}
#包括
#包括
无效反向(char*ptr);
内部主(空){
char src[256]=“Michi”;
反向(src);
printf(“您的新字符串是:%s”,src);
返回(0);
}
无效反向(字符*src){
char dest;
尺寸i,j=0;
i=0;
j=strlen(src)-1;
而(i
不要使用
gets()
,使用
fgets()
。要反转字符串,不需要传递字符数,因为C中的字符串以null结尾。请检查此非常简单的函数:

#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;
    }
}
#包括
无效反向(字符*_Str);
内部主(空)
{
char str[]=“你好,伙计”;
反向(str);
printf(“%s\n”,str);
返回0;
}
无效反向(字符*_Str)
{
字符tmp、*_b、*_e;
_b=_e=_Str;
而(*_e)_e++;
_e--;
而
{
tmp=*_b;
*_b++=*\e;
*_e--=tmp;
}
}

您错过的非常重要的一行是分配空字符。并且不要将字符串的长度作为用户的输入。使用函数
some_integer=strlen(stringname)
这将返回
stringname
的长度,并将其分配给
some\u 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)
}
void reverse(char*userarray)//不需要第二个参数。不要相信你的用户。
{
焦炭温度;
int fromEnd,fromStart=0/
fromEnd=strlen(userarray)-1;//这里字符串的长度被分配给fromEnd。
while(fromStart
并检查您的
printf
语句

应该是

printf(“您的反向字符串是%s\n”,字符串)

不是

printf(“您的反向字符串是%s\n”),字符串


我相信这会奏效。请检查并告诉我它是否适合您。

代码不正确。函数中没有
printf()
所需的字符串

此外,原始代码还可以轻松清除以字符串结尾的空字符
'\0'
。最好使用strlen(string)
而不是向用户询问长度

可能应使用的注释为
-1
。目前尚不清楚OP使用的是什么值

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

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

既然索引从0开始,是否应该
fromEnd=numberOfChars-1
?您真的要问用户字符串有多长?计算机可以更可靠地做到这一点。与用户不同的是,计算机甚至可能在计算字符时很有趣。不要使用变量名(string),这是一个保留关键字。你能给我们一个输入字符串和长度示例吗?仔细看看你的
printf
调用:
string
必须在parantises中。我不确定你从同一点索引这两个字符串是什么意思。你似乎比我有更多的指针(?),但在我从end=numberOfChars改为fromEnd=numberOfChars-1后程序就可以运行了。这就是OP所问的,我应该给出一个完整的答案吗?OP现在知道他需要做什么了,这就是重点。
// fromEnd = numberOfChars;
if (numberOfChars <= 0) return;
fromEnd = numberOfChars - 1;
#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'
'' --> ''