【发布时间】:2016-02-26 15:13:36
【问题描述】:
我不明白为什么它在到达“ if(strcmp(next,str2) == 0) return; ”行后立即停止
现在我注释掉了 %.*s 打印行,这样我就可以在到达 if 语句之前完全打印正在比较的两个字符串,因此 5 在我的示例输入中无关紧要。
我可以看到字符串“ABC DEF”与“BC DEFA”不同,但它似乎满足 if 语句,因为它停止了选取框功能。当我注释掉 if 语句时,它将经历无限递归。
也许我想的一样,所以我打印了两个字符串的 strcmp 程序
它显示 strcmp 是 -1,而不是 0
有人可以启发我吗?也许我只是错过了一些简单的东西,或者一旦 next 等于 str2,是否有更好的方法来打破我的递归。
编辑:我加入了旋转功能
int main(){
int n,i,signlength;
char sign[100]; //max 99 letters
//get number of cases
scanf("%d",&n);
//process each case
for(i=0;i<n;i++){
//ignore rest of line \n
char ic;
while ( (ic = getc(stdin)) != EOF && ic != '\n');
//take in sign string and length of sign
gets(sign);
scanf("%d",&signlength);
if(signlength >= strlen(sign))
printf("[%-*s]\n",signlength,sign);
if(signlength < strlen(sign)){
printf("%s\n",sign);
//printf("[%.*s]\n",signlength,sign);
marquee(sign,signlength,sign);
}
}
return 0;
}
char* marquee(char* str, int size, char* str2){
char* next = rotate(str);
printf("%s\n",next);
//printf("[%.*s]\n",size,next);
if(strcmp(next,str2) == 0)
return;
return marquee(next,size,str2);
}
void swap(char* a, char* b){
char temp = *a;
*a = *b;
*b = temp;
}
void reverse(char* array, int size){
int i;
for(i=0;i<size/2;i++)
swap(array + i, array + (size-i-1));
}
char* rotate(char* str){
reverse(str +1, strlen(str) -1);
reverse(str, strlen(str));
return str;
}
【问题讨论】:
-
我不确定您的函数
marquee是否可以在这种状态下编译...您确定要测试什么吗? -
不测试来自
scanf的返回值总是令人惊讶的秘诀。就像使用已弃用的 gets() 函数一样。请改用 fgets。哦,当您从返回char *的函数中return;时会发生什么? -
@purplepsycho ,不,我不确定。我是 C 新手,不熟悉通过函数时如何网格化,所以我最好的选择就是打印所有内容,哈哈
-
不仅打印
next,还打印next和str。我怀疑您的旋转功能可能正在修改str,以便next和str最终都旋转。如果您显示rotate的代码,我可以告诉您。 -
好的,这正是我上面的建议。我发布了一个可以解决这个特定问题的答案。