使用 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 循环中,您忘记重置变量 i
和 n
以及指针 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
我正在学习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 循环中,您忘记重置变量 i
和 n
以及指针 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