我的输出字符串必须是输入字符串的palindrom。它几乎可以完美工作,但是我对输入字符串的第一个字符有疑问,我的新字符串不会打印出来(实质上,我的新字符串不会打印最后一个字符)。另外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;
}
i
永远不会为零。这就是为什么第一个字符(input_str[0]
)被忽略的原因。
对于启动器,功能gets
是不安全的功能,C标准不支持。
您应该使用标准的C函数fgets
。
您的代码有两个问题。第一个在此循环中
for(i=strlen(input_str)-1;i>0;i--){
new_str[j]=input_str[i];
j++;
}
索引i等于0会被跳过,无法使用它复制源字符串的相应字符。
第二个是目标数组未附加终止符零。
这里是一个演示程序,显示了如何实现对源字符串进行反向复制的功能。
#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] = '\0';
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" ) ] = '\0';
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"