程序在linux环境中会出错,在win7下正常

ly0303521 2015-09-13 03:22:04
下面是我自己写的程序,作用是返回最长回文子字符串,但是在linux mint 和 ubuntu时,有时候会出错,在linux mint 下gdb调试的时候发现,有些循环本来不该进去的却进去了,请大家看看,到底是什么情况
#include <stdio.h>
#include <string.h>
#define MAX(x,y) ( (x) > (y) ? (x) : (y))
int len=0;
char str[50];
int palindrome();
int main(int argc, char *argv[])
{
printf("please input string:");
scanf("%s", str);
palindrome();
printf("len:%d\n" ,len);
return 0;
}
int palindrome(){
int len_str = strlen(str);
int i, j, temp;
char *p, *q, flag;
for (i = 0; i < len_str; i++) {
p = &str[i];
if (len >= len_str-i) {
break;
}
for (j = len_str -1; j >= i; j--) {
q = &str[j];
temp = 0;
flag = 0;
while (*p == *q) {
if (p == q) {
temp ++;
flag = 1;
break;
}
else if (p > q) {
flag = 1;
break;
}
temp += 2;
p ++;
q --;
}
if (flag == 1) {
len = MAX(temp,len);
break;
}
}
}
return 0;
}
...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-09-17
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
ly0303521 2015-09-16
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
[quote=引用 4 楼 ly0303521 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++; 用递归吧, 回文天生就是为递归准备的
我将之前的程序改成用递归的方法,还是会出现这样的问题,测试用的字符串:abbacabbaab[/quote]
while (*p == *q)  /* ==> 换成 */ for (p=&str[i];*p == *q;)
[/quote] 这样该,不行吧
ly0303521 2015-09-16
  • 打赏
  • 举报
回复
引用 4 楼 ly0303521 的回复:
[quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++; 用递归吧, 回文天生就是为递归准备的
我将之前的程序改成用递归的方法,还是会出现这样的问题,测试用的字符串:abbacabbaab[/quote] 这样改,不行吧
fly_dragon_fly 2015-09-15
  • 打赏
  • 举报
回复
引用 4 楼 ly0303521 的回复:
[quote=引用 2 楼 fly_dragon_fly 的回复:] 这是判断[i,j]之间是否回文, 但有 temp += 2; p ++; 用递归吧, 回文天生就是为递归准备的
我将之前的程序改成用递归的方法,还是会出现这样的问题,测试用的字符串:abbacabbaab[/quote]
while (*p == *q)  /* ==> 换成 */ for (p=&str[i];*p == *q;)
ly0303521 2015-09-14
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
这是判断[i,j]之间是否回文, 但有 temp += 2; p ++; 用递归吧, 回文天生就是为递归准备的
我将之前的程序改成用递归的方法,还是会出现这样的问题,测试用的字符串:abbacabbaab
ly0303521 2015-09-14
  • 打赏
  • 举报
回复
引用 1 楼 relaxisland 的回复:
你确定在win7下正常 for (j = len_str -1; j >= i; j--) { ------》这个每次循环,指针p要重新赋值的 不然就是从上次错误的地方开始比较
我使用的测试例子:abbacabbaab 。在WIN7 32位 VC ,显示长度为9,是正确的,在linux下就不对
fly_dragon_fly 2015-09-14
  • 打赏
  • 举报
回复
这是判断[i,j]之间是否回文, 但有 temp += 2; p ++; 用递归吧, 回文天生就是为递归准备的
relaxisland 2015-09-13
  • 打赏
  • 举报
回复
你确定在win7下正常 for (j = len_str -1; j >= i; j--) { ------》这个每次循环,指针p要重新赋值的 不然就是从上次错误的地方开始比较

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧