[英]Reversing a string using pointers and my own functions
我有一个任务,我是 C 的新手。 我将附上作业和我的代码。 基本上,问题是我的程序不起作用,我不知道出了什么问题。
解决以下问题:
编写一个程序来反转用户输入的字符串(字符数组)。
#include <stdio.h>
#include <conio.h>
void reversed_string(char *s,int nr)
{
int i;
for(i=nr; i>=0; i--)
printf("%c",*(s+i));
}
int main()
{
char *s;
int nr;
gets(s);
nr=strlen(s);
reversed_string(s,nr);
return 0;
}
对于初学者来说,指针s
未初始化并且具有不确定的值
char *s;
所以gets
的调用是不安全的(C 标准不支持 function)
gets(s);
调用未定义的行为。
相反,您可以编写 main 例如
char s[100];
fgets( s, sizeof( s ), stdin );
s[ strcspn( s, "\n" ) ] = '\0';
至于 function 然后考虑到反转字符串并不意味着 output 以相反的顺序排列字符串。 这意味着改变字符串本身。
function 应按以下方式声明和定义
char * reversed_string( char *s )
{
if ( *s )
{
for ( char *first = s, *last = s + strlen( s ); first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
主要 function 被称为
puts( reversed_string( s ) );
size_t
)gets
void print_reversed(const char *s, size_t nr)
{
if(str && *str)
do{
putchar(*(s + nr -1));
}while(nr--);
}
int main()
{
char *s = "Hello World!";
size_t nr;
nr=strlen(s);
print_reversed(s,nr);
return 0;
}
如果要反转字符串:
char *reverseString(char *str)
{
char *end = str, *wrk = str;
if(str && *str)
{
while(*(end + 1)) end++;
while(end > wrk)
{
char temp = *wrk;
*wrk++ = *end;
*end-- = temp;
}
}
return str;
}
int main()
{
char s[] = "Hello World!";
printf("Reversed string: `%s`\n", reverseString(s));
}
我想在上面提到的很好的答案中再添加一点关于性能。
来自莫斯科的@Vlad,因此通过使用宏进行交换使程序更高效。
注意:用于交换的按位异或运算假设 a=4 b=5。
后面是最后四位的二进制表示。
0100 ^ 0101 = 0001 -> a == 1
0001 ^ 0101 = 0100 -> b == 4
0001 ^ 0100 = 0101 -> a == 5
#define SWAP(a,b){ \
a=a^b;\
b=a^b;\
a=a^b;\
}
char * reversed_string( char *s )
{
if ( *s )
{
for (char *first = s, *last = s + strlen( s ); first < --last; ++first)
{
SWAP(*first,*last);
}
}
return s;
}
int main( void )
{
enum { N = 100 };
char s[N];
printf( "Enter a string: " );
fgets( s, sizeof( s ), stdin );
s[strcspn( s, "\n" )] = '\0';
puts( reversed_string( s ) );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.