[英]Trying to reverse a C-string but it is not working
我正在尝试反转此 C 字符串,我认为我做对了,但字符串在通过 function 时保持不变。
#include <stdio.h>
char* reverse(char* string);
int main(int arc, char* argv[]) {
char word[] = "Hello World!";
printf("%s\n", word);
printf("%s\n", reverse(word));
return 0;
}
char* reverse(char* string) {
int i, j, n = 0;int len = 0;char temp;
//Gets string length
for (i = 0; *(string + i) != '0'; i++) {
len++;
}
//Reverses string
for (j = len - 1; j >= 0; j--) {
temp = string[n];
string[n] = string[j];
string[j] = temp;
n++;
}
return &string[0];
}
预期 output:世界您好! !dlrow olleH
对于初学者来说,有一个错字
for (i = 0; *(string + i) != '0'; i++) {
你必须写
for (i = 0; *(string + i) != '\0'; i++) {
也就是说,您必须使用'\0'
或0
而不是字符'0'
。
在这个for循环中
for (j = len - 1; j >= 0; j--) {
temp = string[n];
string[n] = string[j];
string[j] = temp;
n++;
}
字符串被颠倒了两次。:)结果你得到了相同的字符串。
function可以通过以下方式查找
char * reverse(char *string)
{
//Gets string length
size_t n = 0;
while ( string[n] != '\0' ) ++n;
//Reverses string
for ( size_t i = 0, m = n / 2; i < m; i++ )
{
char temp = string[i];
string[i] = string[n - i - 1];
string[n - i - 1] = temp;
}
return string;
}
或者可以使用指针按以下方式定义 function
char * reverse(char *string)
{
//Gets string length
char *right = string;
while ( *right ) ++right;
//Reverses string
if ( right != string )
{
for ( char *left = string; left < --right; ++left )
{
char temp = *left;
*left = *right;
*right = temp;
}
}
return string;
}
不使用指针的 function 实现的相同方法可以看下面的方式
char * reverse(char *string)
{
//Gets string length
size_t n = 0;
while ( string[n] != '\0' ) ++n;
//Reverses string
if ( n != 0 )
{
for ( size_t i = 0; i < --n; ++i )
{
char temp = string[i];
string[i] = string[n];
string[n] = temp;
}
}
return string;
}
这是另一种解决方案。 我最喜欢它。 尽管它效率低下,但它并不像早期提出的解决方案那样微不足道。 它基于一个初学者尝试编写一个反转字符串的 function。:)
#include <stdio.h>
#include <string.h>
char *reverse( char *string )
{
size_t n = 0;
while (string[n]) ++n;
while (!( n < 2 ))
{
char c = string[0];
memmove( string, string + 1, --n );
string[n] = c;
}
return string;
}
int main( void )
{
char string[] = "Hello World!";
puts( string );
puts( reverse( string ) );
}
程序 output 是
Hello World!
!dlroW olleH
当然,可以使用在 header <string.h>
中声明的标准字符串 function strlen
,而不是在所有提供的解决方案中手动计算字符串的长度。
问题是输入的word
是一个数组,传递给反向function时衰减为一个指针。
在for循环中,不要使用n
来跟踪position,我建议你使用i
和j
来跟踪字符串的开始和结束,并分别递增和递减它们并使用strlen
来获取长度细绳。
此外,正如上面来自 Moscow 的 @Vlad所提到的,在你的for
循环中你正在检查0
但它应该是\0
这是 null 字符。
请在下面找到生成预期结果的已发布代码的更新:
#include <stdio.h>
char* reverse(char* string);
int main(int arc, char* argv[]) {
char word[] = "Hello World!";
printf("%s ", word);
printf("%s\n", reverse(word));
return 0;
}
char* reverse(char* string) {
int i, j;
char temp;
int len = strlen(string);
//Reverses string
for (i = 0, j = len - 1; i < j; i++, j--) {
temp = string[i];
string[i] = string[j];
string[j] = temp;
}
return &string[0];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.