【发布时间】:2020-06-08 09:39:05
【问题描述】:
上下文:我有 JAVA 编程经验,所以也许这就是阻止我理解问题的原因。练习 1-19 要求编写一个函数 reverse(s) 来反转字符串 s。用它来编写一个程序,一次将其输入反转一行。
注意:我稍微修改了输入参数,使其也取字符数组的长度。
这个方案有问题,如下图。
功能:(YES 和 NO 分别是值为 1 和 0 的常数)
void reverse(char input[],int lim)
{
char tmp[lim];
int j , nl_check;
nl_check = NO;
for(j=0; j<lim-1 && input[j]!='\0';++j) {
if(input[j] == '\n') {
nl_check = YES ;
break;
}
}
--j;
int i;
for(i=0; i<=j ; ++i) {
tmp[j-i]=input[i];
}
if(nl_check==YES) {
tmp[++i]='\n';
}
tmp[++i] = '\0';
for(i=0; tmp[i]!='\0';++i) {
input[i] = tmp[i];
}
tmp[++i] = '\0';
}
输入:
$cat example
hello
this
is
me
and
code
输出:
$./a.out < example > output; cat output
olleh
sihth
sih
h
emh
h
dna
edoc
edoc
我感觉它与在函数内部创建一个字符数组有关,因为当我反转它而不在内部创建一个新的字符数组(显然更好的方法)时,它运行良好。但是,我仍然不明白这段代码的问题是什么......
编辑:下面是一个不使用数组创建的工作函数,暗示'/n','/0'不是错误。
/* Similar to @DNT suggestion, I believe.. this function works.*/
void reverse(char input[] , int lim)
{
int j , nl_check;
nl_check = NO;
for(j=0; j<lim-1 && input[j]!='\0'; ++j)
{
if(input[j] == '\n')
{
nl_check = YES ;
break;
}
}
int i,z;
char tmp='\0';
--j;
for(i=0,z=j; i!=((j+1)/2) ; ++i,--z)
{
tmp = input[i];
input[i] = input[z];
input[z] = tmp;
}
if(nl_check==YES)
{
input[++j]='\n';
}
input[++j] = '\0';
}
【问题讨论】:
-
您在向
tmp数组写入任何内容之前调用了printf("%s",tmp);。我也看不出这在 Java 中是如何工作的。 -
printf("%s",tmp);在函数为其元素分配任何值之前打印tmp。为什么那条线在那里?充其量,它会打印之前调用函数时留在堆栈中的数据。 -
tmp[++i]='\n';和第一个tmp[++i]='\0'可以超出tmp的末尾。 -
第二个
tmp[++i]='\0';不需要,可能会超出tmp的末尾。也许目的是在input中放置一个空值,而不是tmp。 -
@MikeJalfrezi:现在你根本没有
printf。请发帖minimal reproducible example。