c语言程序调试结果为什么会和运行结果不一致

夏天换上冬装 2017-05-18 09:18:24
这段代码调试时譬如输入123,则结果为6,运行时就会变成14,百思不得其解,请各位帮帮忙,非常感谢!
#include<stdio.h>
#define M 50
//int vmask(int n);
int main(){
//char str[][10] ={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char num[M];
int n,mask,t,d,index,count,i;
int sum = 0;
scanf("%s",num);
for(i = 0;i < M;i++)
if(!(num[i] >= '0' && num[i] <= '9'))
num[i] = 0;
// puts(num);
for(i = 0;i < M;i++){
if(num[i] >= '0'&&num[i] <='9' )
sum += (num[i] - '0');
}
printf("%d\n",sum);
return 0;
}
...全文
2926 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
夏天换上冬装 2017-05-18
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
num不初始化,里面有对应内存中以前的值。
恩,非常感谢。
夏天换上冬装 2017-05-18
  • 打赏
  • 举报
回复
引用 6 楼 starytx 的回复:
[quote=引用 4 楼 a501900309 的回复:] [quote=引用 2 楼 starytx 的回复:] char num[M] = {0}; 初始化一下字符串数组
/****** 确实就正常了,非常感谢。 但是为什么用这 for(i = 0;i < M;i++) if(!(num[i] >= '0' && num[i] <= '9')) num[i] = 0; 把非‘0’到‘9’的值改为0,则会出现运行和调试不一致的问题呀?[/quote]因为你没有初始化,所以num里边的值不确定,debug模式下和release模式对未初始化的变量处理不一样,所以要养成初始化变量的好习惯。顺便说一下,如果像我那样初始化了,第一个for循环就没有啥必要了。[/quote] 恩恩,非常感谢
自信男孩 2017-05-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

#define M 50

int main()
{
    char num[M];
    //int n,mask,t,d,index,count,i;
    int i;
    int sum = 0;

    scanf("%s", num);
    for(i = 0; i < strlen(num); i++)
        if(!(num[i] >= '0' && num[i] <= '9'))
            num[i] = 0;
    // puts(num);
    for(i = 0;i < M;i++){
        if(num[i] >= '0'&&num[i] <='9' )
            sum += (num[i] - '0');
    }
    printf("%d\n",sum);
    return 0;
}
输入的不到M(50)个,后面的数据都是随机值。所以第一个for循环的判断条件用strlen计算一下输入的字符个数;scanf会自动加上字符串的结束标记'\0'(值等价与0) 若输入的非'0'~'9',num[i] = 0;0和'\0'是一样的,所以后面puts调试的输出遇到'\0'结束输出,调试的和sum 的结果不一致。
赵4老师 2017-05-18
  • 打赏
  • 举报
回复
num不初始化,里面有对应内存中以前的值。
starytx 2017-05-18
  • 打赏
  • 举报
回复
引用 4 楼 a501900309 的回复:
[quote=引用 2 楼 starytx 的回复:] char num[M] = {0}; 初始化一下字符串数组
/****** 确实就正常了,非常感谢。 但是为什么用这 for(i = 0;i < M;i++) if(!(num[i] >= '0' && num[i] <= '9')) num[i] = 0; 把非‘0’到‘9’的值改为0,则会出现运行和调试不一致的问题呀?[/quote]因为你没有初始化,所以num里边的值不确定,debug模式下和release模式对未初始化的变量处理不一样,所以要养成初始化变量的好习惯。顺便说一下,如果像我那样初始化了,第一个for循环就没有啥必要了。
夏天换上冬装 2017-05-18
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
我还是小白,前面一句是看懂了,但能不能麻烦结合具体语句解释下,比如哪条语句会让计算机因为什么原因而出错了,我
夏天换上冬装 2017-05-18
  • 打赏
  • 举报
回复
引用 2 楼 starytx 的回复:
char num[M] = {0}; 初始化一下字符串数组
/****** 确实就正常了,非常感谢。 但是为什么用这 for(i = 0;i < M;i++) if(!(num[i] >= '0' && num[i] <= '9')) num[i] = 0; 把非‘0’到‘9’的值改为0,则会出现运行和调试不一致的问题呀?
赵4老师 2017-05-18
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
starytx 2017-05-18
  • 打赏
  • 举报
回复
char num[M] = {0}; 初始化一下字符串数组
赵4老师 2017-05-18
  • 打赏
  • 举报
回复
#include<stdio.h>
#define M 50
//int vmask(int n);
int main(){
//char str[][10] ={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char num[M];
int n,mask,t,d,index,count,i;
int sum = 0;
for(i = 0;i < M;i++)num[i] = 0;
scanf("%s",num);
//	puts(num);
for(i = 0;i < M;i++){
if(num[i] >= '0'&&num[i] <='9' )
sum += (num[i] - '0'); 
}
printf("%d\n",sum);
return 0;
}

70,020

社区成员

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

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