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