我有一个作业,我是 C 的新手。我将附上作业和我的代码。基本上,问题是我的程序不起作用,我不知道出了什么问题。
解决以下问题:
- 使用指标(指标算术而不是阵列 [i]),但使用您自己的用户定义函式
撰写一个程序来反转用户输入的字符串(字符阵列)。
#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;
}
uj5u.com热心网友回复:
对于初学者,指标s
未初始化并且具有不确定的值
char *s;
所以呼叫gets
不安全的函式(C标准不支持该函式)
gets(s);
呼叫未定义的行为。
相反,您可以撰写 main 例如
char s[100];
fgets( s, sizeof( s ), stdin );
s[ strcspn( s, "\n" ) ] = '\0';
至于函式,请考虑反转字符串并不意味着以相反的顺序输出字符串。这意味着改变字符串本身。
该函式应按以下方式宣告和定义
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;
}
在 main 函式中呼叫如下
puts( reversed_string( s ) );
这是一个演示程序。
#include <stdio.h>
#include <string.h>
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;
}
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 ) );
}
如果您可能不使用标准字符串函式,strlen
那么该函式reversed_string
可以如下所示
char * reversed_string( char *s )
{
if ( *s )
{
char *last = s;
while ( *last ) last;
for (char *first = s; first < --last; first)
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
uj5u.com热心网友回复:
- 您在字符串范围之外阅读。
- 使用正确的尺寸型别 (
size_t
) - 命名函式不混淆方式。您的函式是以相反的顺序打印字符串,而不是反转字符串。
- 您使用未初始化的指标
- 不使用
gets
void print_reversed(const char *str, size_t nr)
{
if(str && *str)
do{
putchar(*(str 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));
}
uj5u.com热心网友回复:
我想在上面提到的很好的答案中再添加一点关于性能。
来自莫斯科的@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 ) );
}
0 评论