用 char aaryas 反转字符串

Posted

技术标签:

【中文标题】用 char aaryas 反转字符串【英文标题】:Reversing string with char aaryas 【发布时间】:2022-01-08 09:09:34 【问题描述】:

我现在正在学习 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] != '\0') 
        *(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.***

但它只返回第一个反转的词位。

【问题讨论】:

strcpy(beg, piece); 将在 strtok 循环的最后一次迭代中失败(取消引用 NULL 指针)。 @Anchr 代码没有意义。 @Anchr 看到这个问题***.com/questions/69784686/… 【参考方案1】:

你得到一个异常是因为你在调用 strcpy 时没有检查指针片段是否等于 NULL

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

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

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

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

#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

【讨论】:

与您链接的那个类似吗? (那个+1。) @ryyker 我应该关闭重复的答案。但这很无聊,我决定写点东西。 :) 我在尝试,但你更快。您还在这里回答了 OP 代码中的其他几个错误。

以上是关于用 char aaryas 反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用指针反转 char 字符串

003实现字符串反转reverse

c----反转字符串

在 C 中使用指针反转字符串(必须使用无符号 *char)

LC 反转字符串

使用字符数组反转字符串