使用 char aaryas 反转字符串

Reversing string with char aaryas

我正在学习C,我的程序中有一个问题。
我需要像
这样反转字符串 I like dogs -> I ekil sgod 我写了这段代码

char end[MAX_LEN];
char beg[MAX_LEN];
char* piece = strtok(str, " ");
strcpy(end, piece);
strcpy(beg, piece);
char* pbeg = beg;
char* prev = piece;
int n = strlen(piece)-1;
i = 0;
int n = 0;

while (piece != NULL) {
    //printf("\n%s", piece);
    while (piece[i] != '[=10=]') {
        *(prev + n -i ) = *(pbeg + i);
            i++;
    }

    printf("\n%s", piece);
    piece = strtok(NULL, " ");
    strcpy(beg, piece); // also in this moment in debugging i saw this error ***Exception thrown at 0x7CBAF7B3 (ucrtbased.dll) in лаб131.exe: 0xC0000005: Access violation reading location 0x00000000.***
}

但它 returns 只有第一个词位颠倒了。

您遇到异常是因为您在调用 strcpy 时没有检查指针块是否等于 NULL

piece = strtok(NULL, " ");
strcpy(beg, piece);

同样在 while 循环中,您忘记重置变量 in 以及指针 prev.

使用函数 strtok 是个坏主意,因为源字符串可以包含相邻的 space 个字符,这些字符应该保留在结果字符串中。另外你有太多的数组和指针只会让代码的读者感到困惑。

这是一个演示程序,展示了如何轻松完成任务。

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

void reverse_n( char s[], size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-i-1];
        s[n-i-1] = c;
    }
}

int main(void) 
{
    char input[] = "I like dogs";
    
    const char *separator = " \t";
    
    for ( char *p = input; *p; )
    {
        p += strspn( p, separator );
        char *q = p;
        
        p += strcspn( p, separator );
        
        reverse_n( q, p - q );
    }
    
    puts( input );
    
    return 0;
}

程序输出为

I ekil sgod