[英]Using pointers to reverse a String
嘗試使用指針反轉 C 中的字符串,我似乎無法弄清楚我的代碼有什么問題。 有誰知道為什么這不起作用?
int main(void)
{
char sentence[100];
printf("Enter any string: ");
scanf("%[^\n]s", sentence);
char *sPtr;
sPtr = sentence;
int length = 0;
printf("Original string = %s\n", sentence);
while (*sPtr != '\0') {
++length;
++sPtr;
}
printf("Reverse string = ");
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr + 1));
}
puts("");
return 0;
}
錯誤在這里:
while (*sPtr != '\0') {
++length;
++sPtr;
}
此時 sPtr 指向字符串末尾,因此在第二個循環中它永遠不會遞減。
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr+1));
}
一個可能的解決方案是這樣的:
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr));
--sPtr;
}
您總是在字符串末尾打印一個字符。
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr+1));
}
應該
for (int i = length-1; i >= 0; --i) {
printf("%c", *(sPtr-(length-i));
}
或者
for (int i = length; i >= 0; --i) {
sPtr--; //decrement first as sPtr will be pointing to \0 char
printf("%c", *sPtr);
}
這是我想出的解決方案。 感謝任何人提供的幫助!
while (*sPtr != '\0') {
++length;
++sPtr;
}
printf("Reverse string = ");
sPtr = sentence;
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr+length));
--sPtr;
}
scanf
只是用已知的字符串。 scanf 可能會失敗,您將不知道它是您的功能還是用戶輸入。函數簡單,不使用庫函數。
char *reverse(char *str)
{
char *head = str, *tail = str;
if(str && *str)
{
while(*tail) tail++;
tail--;
while(tail > head)
{
int ch = *tail;
*tail-- = *head;
*head++ = ch;
}
}
return str;
}
在這個循環之后
while (*sPtr != '\0') {
++length;
++sPtr;
}
指針 sPtr 指向終止零。 因此,在下一個循環中,您將開始從終止零之后的不確定字符中輸出字符串。
for (int i = length; i >= 0; --i) {
printf("%c", *(sPtr+1));
}
表達式*(sPtr+1)
在循環中沒有改變。
考慮到您沒有反轉字符串。 您正在嘗試以相反的順序輸出字符串。 它不一樣。 此外,您正在使用 int 類型的中間變量。
要僅使用指針反轉字符串,代碼可以如下所示。
char *last = sentence;
while ( *last ) ++last;
if ( sentence != last )
{
for ( char *first = sentence; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
printf( "Reversed string = %s\n", sentence );
這是一個演示程序。
#include <stdio.h>
int main(void)
{
char sentence[100] = { '\0' };
printf( "Enter any string: " );
scanf("%99[^\n]s", sentence );
char *last = sentence;
while ( *last ) ++ last;
if ( sentence != last )
{
for ( char *first = sentence; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
printf( "Reversed string = %s\n", sentence );
return 0;
}
它的輸出可能看起來像
Enter any string: Hello Jordan
Reversed string = nadroJ olleH
您可以編寫一個單獨的函數來反轉字符串。 只需將將字符串從 main 反轉的代碼移動到一個單獨的函數中,例如
#include <stdio.h>
char * reverse( char *s )
{
char *last = s;
while ( *last ) ++last;
if ( s != last )
{
for ( char *first = s; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
int main(void)
{
char sentence[100] = { '\0' };
printf( "Enter any string: " );
scanf("%99[^\n]s", sentence );
printf( "Revresed string = %s\n", reverse( sentence ) );
return 0;
}
如果您只想使用指針以相反的順序輸出字符串,那么程序可以非常簡單。
這個給你。
#include <stdio.h>
int main(void)
{
char sentence[100] = { '\0' };
printf( "Enter any string: " );
scanf("%99[^\n]s", sentence );
const char *sPtr = sentence;
while ( *sPtr ) ++ sPtr;
printf( "Revresed string = ");
while ( sPtr != sentence ) putchar( *--sPtr );
putchar( '\n' );
return 0;
}
您可以通過遞歸函數進行更簡單的實現。 例如
#include <stdio.h>
void reversed_output( const char *s )
{
if ( *s )
{
reversed_output( s + 1 );
putchar( *s );
}
}
int main(void)
{
char sentence[100] = { '\0' };
printf( "Enter any string: " );
scanf("%99[^\n]s", sentence );
printf( "Revresed string = ");
reversed_output( sentence );
putchar( '\n' );
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.