创建字符串的副本但在 C 中反转

Create a duplicate of a string but reversed in C

我正在尝试创建一个字符串的副本,但被颠倒了。 我能够对每个字符进行 strcpy 并单独打印它们,但是当我打印整个重复字符串时我什么也得不到。

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

int     main(void)
{
    char    str[101] = "Lieur a Rueil";
    char    temp[101];
    int     i;
    int     j;

    i = 0;
    j = strlen(str);

    while (str[j] - 1)
    {
        strcpy(&temp[i], &str[j]);
        printf("%c", temp[i]);
        j--;
        i++;
    }
    printf("\n");
    printf("temp: %s\n", temp);
    return (0);
}

输出:

lieuR a rueiL
temp:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
 
int main(void)
{
    char    str[101] = "Lieur a Rueil";
    char    temp[101];
    size_t  sz = strlen(str);
 
    for(size_t i=0;i<sz; ++i)
    {
        temp[sz-i-1] = str[i];
    }
    temp[sz]=0;
 
    printf("temp: %s\n", temp);
    return (0);
}

输出:

temp: lieuR a rueiL

这个while循环

while (str[j] - 1)
{
    strcpy(&temp[i], &str[j]);
    printf("%c", temp[i]);
    j--;
    i++;
}

没有意义。循环的条件可以调用未定义的行为 由于访问数组以外的内存。 strcpy.

的调用也存在同样的问题

程序的主要逻辑可以更简单地实现。例如

size_t i = 0;

for ( size_t j = strlen( str ); j-- != 0; i++ )
{
    temp[i] = str[j];
}

temp[i] = '[=11=]';

printf("\ntemp: %s\n", temp);

这是一个演示程序。

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

int main(void) 
{
    char str[] = "Lieur a Rueil";
    char temp[sizeof( str )];
    
    size_t i = 0;

    for ( size_t j = strlen( str ); j-- != 0; i++ )
    {
        temp[i] = str[j];
    }

    temp[i] = '[=12=]';

    printf("\ntemp: %s\n", temp);   
}   

程序输出为

temp: lieuR a rueiL

对原始代码进行最少的更改:

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

int     main(void)
{
    char    str[101] = "Lieur a Rueil";
    char    temp[101];
    int     i;
    int     j;

    i = 0;
    j = strlen(str);

    temp[j] = '[=10=]';
    while (j)
    {        
       temp[j -1] = str[i];
        printf("%c", temp[j]);
        j--;
        i++;
     }
     printf("\n");
     printf("temp: %s\n", temp);
     return (0);
}