c语言 - 为什么我不能正确打印第一个/最后一个字符?



我的输出字符串需要是输入字符串的回文。它几乎完美,但我对输入字符串的第一个字符有问题,我的新字符串不会打印它(本质上我的新串不会打印最后一个字符(。此外,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](被忽略的原因。

相关内容

最新更新