我的输出字符串需要是输入字符串的回文。它几乎完美,但我对输入字符串的第一个字符有问题,我的新字符串不会打印它(本质上我的新串不会打印最后一个字符(。此外,strrev((在Ubuntu上不起作用,所以我需要在不使用该函数的情况下完成此操作。
#include <stdio.h>
#include <string.h>
int main(void){
int i,j=0;
char input_str[10];
char new_str[10];
printf("Enter characters:n");
gets(input_str);
for(i=strlen(input_str)-1;i>0;i--){
new_str[j]=input_str[i];
j++;
}
printf("Output:n");
printf("%s", new_str);
return 0;
}
对于初学者来说,函数gets
是不安全的函数,不受C标准的支持。
您应该使用标准的C函数fgets
。
您的代码有两个问题。第一个是在这个循环
for(i=strlen(input_str)-1;i>0;i--){
new_str[j]=input_str[i];
j++;
}
等于0的索引i被跳过,不使用它来复制源字符串的相应字符。
第二个是目标数组没有附加终止的零字符。
这里有一个演示程序,展示了如何实现一个对源字符串进行反向复制的函数。
#include <stdio.h>
#include <string.h>
char * reverse_copy( char *dsn, const char *src )
{
size_t n = strlen( src );
size_t i = 0;
for ( ; i < n; i++ )
{
dsn[i] = src[n - i - 1];
}
dsn[i] = ' ';
return dsn;
}
int main(void)
{
enum { N = 10 };
char input_str[N] = "";
char new_str[N];
printf( "Enter a string (less than %zu symbols): ", ( size_t )N );
fgets( input_str, N, stdin );
input_str[ strcspn( input_str, "n" ) ] = ' ';
printf( ""%s"n", input_str );
printf( ""%s"n", reverse_copy( new_str, input_str ) );
return 0;
}
例如,程序输出可能看起来像
Enter a string (less than 10 symbols): Hello
"Hello"
"olleH"
i
从不为零。这就是为什么第一个字符(input_str[0]
(被忽略的原因。