代码之家  ›  专栏  ›  技术社区  ›  David Machado

我用C写的这个字符串反转器有什么问题?[已关闭]

  •  -5
  • David Machado  · 技术社区  · 6 年前

    我也看到过类似的事情(变量的变化),但这一次没有,你们能告诉我为什么吗? 代码如下:

    #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);
    }
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Eric Postpischil    6 年前

    在循环的最后一次迭代中, j 等于 i . str[i] 是空字符( str[0] 通过 str[i-1] 字符串中的非空字符)。所以,在最后一次迭代中, rvrs[k] 设置为空字符。在这一点上, k 为零。因此 rvrs 包含空字符串(其中空字符是第一个字符的字符串,因此字符串结尾没有非空字符)。

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

    • 首先,设置 rvrs[i] 设置为零,以便它将在您希望的位置终止。

    • 其次,修改循环以正确反转 0 i-1 ,不是来自 0 . 注意确保 k 执行此操作时具有适当的值。

        2
  •  0
  •   Stephan Lechner    6 年前

    具有 j<=strlen(str) ,可以反转包含字符串终止字符的字符串。因此 rvrs 将是字符串终止字符,表示 rvrs 将/表现为“空”字符串。

    相反,你会在印度群岛之间逆转一切 0..strlen(str)-1 ,您应该终止 rvrs 在位置 rvrs[strlen(str)]='\0' .

    顺便说一句:请注意 gets 已过时/已弃用。使用 fgets 相反

        3
  •  0
  •   Vlad from Moscow    6 年前

    对于符合C标准的启动器 main 无参数应声明如下

    int main( void )
    

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

    什么时候 j 等于 i 这反过来等于 strlen(str) 然后 str[j] 等于“\0”。即在数组的开头写入终止零 rvrs

    rvrs[k]=str[j];
    

    这没有道理。

    考虑到功能 strlen 具有返回类型 size_t int .

    程序可以如下所示

    #include <stdio.h>
    #include <string.h>
    
    #define N   255
    
    int main(void) 
    {
        char str[N], rvrs[N];
        str[0] = '\0';
    
        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] = '\0';
    
        puts( rvrs );
    
        return 0;
    }
    

    其输出可能是

    Insert your string: Hello David Machado
    odahcaM divaD olleH