用 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 循环中,您忘记重置变量 i
和 n
以及指针 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 反转字符串的主要内容,如果未能解决你的问题,请参考以下文章