我用 C 写的这个字符串反向器有什么问题?
What is wrong with this string reverser I wrote in C?
我见过类似的东西(变量的变化)有效,但是这个不行你们能告诉我为什么吗?
这是代码:
#include <stdio.h>
#include <string.h>
int main(){
int i,j,k;
char str[255],rvrs[255];
printf("Insert your string: ");
gets(str);
i=strlen(str);
k=i;
for(j=0;j<=i;j++,k--){
rvrs[k]=str[j];
}
printf("%s",rvrs);
}
在循环的最后一次迭代中,j
等于 i
。 str[i]
是空字符(str[0]
到 str[i-1]
是字符串中的 i
非空字符)。因此,在最后一次迭代中,rvrs[k]
被设置为空字符。并且,此时 k
为零。因此,rvrs
包含一个空字符串(第一个字符为空字符的字符串,因此该字符串以无非空字符结尾)。
要解决此问题,您需要修改代码:
首先,将rvrs[i]
设置为零,这样它就会在你想要的地方终止。
其次,修改循环以正确反转元素从 0
到 i-1
,而不是从 0
到 i
。执行此操作时请注意确保 k
具有正确的值。
使用j<=strlen(str)
,您可以反转包括字符串终止符在内的字符串。因此,rvrs
的第一个字符将是字符串终止字符,这意味着 rvrs
将 be/behave 作为 "empty" 字符串。
相反,您将反转索引 0..strlen(str)-1
之间的所有内容,并且您应该在 rvrs[strlen(str)]='[=15=]'
.
位置终止 rvrs
顺便说一句:请注意 gets
是 obsolete/deprecated。请改用 fgets
。
对于根据 C 标准的初学者,不带参数的函数 main
应声明为
int main( void )
函数gets
不安全,C标准不再支持。例如使用标准函数 fgets
.
当 j
等于 i
又等于 strlen(str)
时,str[j]
等于 '\0'。即终止零写在数组的开头 rvrs
rvrs[k]=str[j];
这没有意义。
考虑到函数 strlen
具有 return 类型 size_t
而不是 int
。
程序可以这样看
#include <stdio.h>
#include <string.h>
#define N 255
int main(void)
{
char str[N], rvrs[N];
str[0] = '[=12=]';
printf("Insert your string: ");
fgets( str, sizeof( str ), stdin );
size_t n = strcspn( str, "\n" );
for ( size_t j = 0; j != n; j++ )
{
rvrs[j] = str[n - j - 1];
}
rvrs[n] = '[=12=]';
puts( rvrs );
return 0;
}
它的输出可能是
Insert your string: Hello David Machado
odahcaM divaD olleH
我见过类似的东西(变量的变化)有效,但是这个不行你们能告诉我为什么吗? 这是代码:
#include <stdio.h>
#include <string.h>
int main(){
int i,j,k;
char str[255],rvrs[255];
printf("Insert your string: ");
gets(str);
i=strlen(str);
k=i;
for(j=0;j<=i;j++,k--){
rvrs[k]=str[j];
}
printf("%s",rvrs);
}
在循环的最后一次迭代中,j
等于 i
。 str[i]
是空字符(str[0]
到 str[i-1]
是字符串中的 i
非空字符)。因此,在最后一次迭代中,rvrs[k]
被设置为空字符。并且,此时 k
为零。因此,rvrs
包含一个空字符串(第一个字符为空字符的字符串,因此该字符串以无非空字符结尾)。
要解决此问题,您需要修改代码:
首先,将
rvrs[i]
设置为零,这样它就会在你想要的地方终止。其次,修改循环以正确反转元素从
0
到i-1
,而不是从0
到i
。执行此操作时请注意确保k
具有正确的值。
使用j<=strlen(str)
,您可以反转包括字符串终止符在内的字符串。因此,rvrs
的第一个字符将是字符串终止字符,这意味着 rvrs
将 be/behave 作为 "empty" 字符串。
相反,您将反转索引 0..strlen(str)-1
之间的所有内容,并且您应该在 rvrs[strlen(str)]='[=15=]'
.
rvrs
顺便说一句:请注意 gets
是 obsolete/deprecated。请改用 fgets
。
对于根据 C 标准的初学者,不带参数的函数 main
应声明为
int main( void )
函数gets
不安全,C标准不再支持。例如使用标准函数 fgets
.
当 j
等于 i
又等于 strlen(str)
时,str[j]
等于 '\0'。即终止零写在数组的开头 rvrs
rvrs[k]=str[j];
这没有意义。
考虑到函数 strlen
具有 return 类型 size_t
而不是 int
。
程序可以这样看
#include <stdio.h>
#include <string.h>
#define N 255
int main(void)
{
char str[N], rvrs[N];
str[0] = '[=12=]';
printf("Insert your string: ");
fgets( str, sizeof( str ), stdin );
size_t n = strcspn( str, "\n" );
for ( size_t j = 0; j != n; j++ )
{
rvrs[j] = str[n - j - 1];
}
rvrs[n] = '[=12=]';
puts( rvrs );
return 0;
}
它的输出可能是
Insert your string: Hello David Machado
odahcaM divaD olleH