我用 C 写的这个字符串反向器有什么问题?

What is wrong with this string reverser I wrote in C?

我见过类似的东西(变量的变化)有效,但是这个不行你们能告诉我为什么吗? 这是代码:

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

int main(){
    int i,j,k;
    char str[255],rvrs[255];

    printf("Insert your string: ");
    gets(str);

    i=strlen(str);
    k=i;

    for(j=0;j<=i;j++,k--){
        rvrs[k]=str[j];
    }

    printf("%s",rvrs);
}

在循环的最后一次迭代中,j 等于 istr[i] 是空字符(str[0]str[i-1] 是字符串中的 i 非空字符)。因此,在最后一次迭代中,rvrs[k] 被设置为空字符。并且,此时 k 为零。因此,rvrs包含一个空字符串(第一个字符为空字符的字符串,因此该字符串以无非空字符结尾)。

要解决此问题,您需要修改代码:

  • 首先,将rvrs[i]设置为零,这样它就会在你想要的地方终止。

  • 其次,修改循环以正确反转元素从 0i-1,而不是从 0i。执行此操作时请注意确保 k 具有正确的值。

使用j<=strlen(str),您可以反转包括字符串终止符在内的字符串。因此,rvrs 的第一个字符将是字符串终止字符,这意味着 rvrs 将 be/behave 作为 "empty" 字符串。

相反,您将反转索引 0..strlen(str)-1 之间的所有内容,并且您应该在 rvrs[strlen(str)]='[=15=]'.

位置终止 rvrs

顺便说一句:请注意 gets 是 obsolete/deprecated。请改用 fgets

对于根据 C 标准的初学者,不带参数的函数 main 应声明为

int main( void )

函数gets不安全,C标准不再支持。例如使用标准函数 fgets.

j 等于 i 又等于 strlen(str) 时,str[j] 等于 '\0'。即终止零写在数组的开头 rvrs

rvrs[k]=str[j];

这没有意义。

考虑到函数 strlen 具有 return 类型 size_t 而不是 int

程序可以这样看

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

#define N   255

int main(void) 
{
    char str[N], rvrs[N];
    str[0] = '[=12=]';

    printf("Insert your string: ");
    fgets( str, sizeof( str ), stdin );

    size_t n = strcspn( str, "\n" );

    for ( size_t j = 0; j != n; j++ )
    {
        rvrs[j] = str[n - j - 1];
    }

    rvrs[n] = '[=12=]';

    puts( rvrs );

    return 0;
}

它的输出可能是

Insert your string: Hello David Machado
odahcaM divaD olleH