[英]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.