user-0 提问: 运行错误到底是什么 困扰我好久了

回复:
user: user-0
content: 引用 16 楼 拥抱Linux的回复:[quote=引用 13 楼 Martin Morning 的回复:] 针对你说的 1.j不会越界，因为j＝4的时候在for里面会判断是否j＜4，如果不满足，就不会执行循环，所以不存在越界一说。 2.你说的确实没错，不过我觉得就做题而言多此一举了，因为测试点不会用错误的输入来测试你的答案，只会用一组正确的数来检测 3.return 0应该加的，不过每次都懒所以忘记加了，不过不会影响系统判题  嗯，你说的是对的，上面的回复确实不严谨，非常抱歉！  另外，把你上面的代码复制、粘贴到PAT原题练习页面，经过测试，把 gets(s); 改成 scanf("%s",s); 之后，就通过了。   具体原因是什么，俺也不知道，因为没有研究过gets函数。建议你可以研究一下，到时候跟大家再分享一下结论那就最好了。 [/quote] 抱歉老哥，前段时间有点事没看论坛。 我刚刚查了下，ges会在读取一个字符串后加上\0，而我定义的数组只有4个单位，所以会越界。这样推的话scanf ％s是不会加的。

user: user-1
content: （1）sort函数里，第一层循环变量 i 的结束条件不对，数组下标会越界，应该是   for (i = 0; i < 3; i++) // 否则下面的 j = i + 1 会越界，而且，比较排序的时候， // 前一个数与后一个数比较，前一个数的下标的最大值必然是 （数组元素个数-1） 。  但是，运行时没有报错，就是不知道答题系统自动检测的时候算不算这个是运行时错误。  （2）对于输入的数或者字符串，增加了检查语句，确认是否为数字，  	for (i = 0; i < n; i++) { 		a[i] = s[i] - '0'; 		// 检查是否每位都是数字 		if (a[i] < 0 || a[i] > 9) { 			printf("Wrong input!\n"); 			return -1; 		} 	}  试了一下，不加上面的检查语句，输入字母进去，最后的结果也能算出来是6174，但是中间过程不符合题意。  （3）为main函数，在最后增加一句返回值语句， return 0;  其它的，没有看出来还有什么不对的地方。你再提交试试呢？

user: user-2
content: 主要问题：越界了，字符串长度是字符长度+1，应该是s[5]（做题你直接给他写100，1000又不会出错） 次要问题：输出格式应该不要求每行输出0123这个格式吧，输出123会错吗？反正最后结果一定是6174

user: user-0
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过[img=https://img-bbs.csdn.net/upload/201904/11/1554956385_387505.png" alt="" />你这写的不符合题意啊  看案例就知道是输入一次就可以了

user: user-0
content: 引用 7 楼 xdn1ce的回复:是不是得写成 %04d 只有2种可能，4位和3位，如果是3位就在前面加个0。你再看看

user: user-0
content: 只有2种可能，4位和3位，如果是3位就在前面加个0。你再看看

user: user-3
content: 是不是得写成 %04d

user: user-3
content: if(k<1000) printf(........... = 0%d)   你这一句能保证是四位数字吗？可能有问题。

user: user-0
content: 引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过 也许你的是对的，但我想知道的是我错在哪

user: user-0
content: 引用 2 楼 coo135的回复:哈哈，算法都对，就是没仔细看题目~~   输入格式：  输入给出一个 (0,10 ​4 ​​ ) 区间内的正整数 N。  所以你要输入N，然后循环N次 才对。  还有一点，就是要把gets() 换成scanf() ，切记!! 这个N不是循环次数吧，你看给的输入输出案例。输入一次运行一次就行了

user: user-0
content: 这个N不是循环次数吧，你看给的输入输出案例。输入一次运行一次就行了

user: user-4
content: 哈哈，算法都对，就是没仔细看题目~~   输入格式：  输入给出一个 (0,10 ​4 ​​ ) 区间内的正整数 N。  所以你要输入N，然后循环N次 才对。  还有一点，就是要把gets() 换成scanf() ，切记!!

user: user-5
content: #include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过

user: user-1
content: 引用 13 楼 Martin Morning 的回复:针对你说的 1.j不会越界，因为j＝4的时候在for里面会判断是否j＜4，如果不满足，就不会执行循环，所以不存在越界一说。 2.你说的确实没错，不过我觉得就做题而言多此一举了，因为测试点不会用错误的输入来测试你的答案，只会用一组正确的数来检测 3.return 0应该加的，不过每次都懒所以忘记加了，不过不会影响系统判题  嗯，你说的是对的，上面的回复确实不严谨，非常抱歉！  另外，把你上面的代码复制、粘贴到PAT原题练习页面，经过测试，把 gets(s); 改成 scanf("%s",s); 之后，就通过了。   具体原因是什么，俺也不知道，因为没有研究过gets函数。建议你可以研究一下，到时候跟大家再分享一下结论那就最好了。

user: user-2
content: 如果题目没有内存大小要求，你数组大小往大了给，因为你也不清楚什么时候就越界了。比如题目要求不大于5的字符串，你就char st[10];来保存

user: user-0
content: 引用 11 楼 qq_38834405的回复:主要问题：越界了，字符串长度是字符长度+1，应该是s[5]（做题你直接给他写100，1000又不会出错） 次要问题：输出格式应该不要求每行输出0123这个格式吧，输出123会错吗？反正最后结果一定是6174 老哥稳，换成s5全通过了。0123是因为题目里说了每个数按4位输出，给的案例也是这样。 不过你括号里那一句话没看懂，望老哥指教

user: user-0
content: 针对你说的 1.j不会越界，因为j＝4的时候在for里面会判断是否j＜4，如果不满足，就不会执行循环，所以不存在越界一说。 2.你说的确实没错，不过我觉得就做题而言多此一举了，因为测试点不会用错误的输入来测试你的答案，只会用一组正确的数来检测 3.return 0应该加的，不过每次都懒所以忘记加了，不过不会影响系统判题