user-0 提问: 【求助】求问各位大佬，自己的VS上能过，OJ上显示运行时出错

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 10 楼 user-2的回复:有错是可能是因为少打了一个换行，在for打印前多加一行printf(“\n”);试试。  另外，如果OJ控制输入可以保证的话，也可以去掉一些判断输入错误的代码。 比如去掉 if(n > 100000) break;这一行 fgets这一行改成gets(s); 去掉if(strlen(s) != n) break;这一行，或者把它改成 n = n > strlen(s) ? n : strlen(s); 去掉fflush(stdin)这一行  至于逻辑，正确的做法应该是for(0到k)循环来计算tem，也就是重复k次，但这样做效率太低。你现在的逻辑直接用第一次指令后的x，y重复k-1，再计算最后一次指令的最大tem，好像是没问题的，主要是怎么证明这中间重复的k-1次没有出现最大的tem，能证明就没问题。 嗯对，就因为OJ能控制输入所以省略了几行。关于逻辑，我跟标准答案的文字讲解核对了一下，是符合标准答案的，所以这个想法没问题，是我写代码实现它的过程中出了问题。我再好好看看，前辈费心啦！

user: user-2
content: 有错是可能是因为少打了一个换行，在for打印前多加一行printf(“\n”);试试。  另外，如果OJ控制输入可以保证的话，也可以去掉一些判断输入错误的代码。 比如去掉 if(n > 100000) break;这一行 fgets这一行改成gets(s); 去掉if(strlen(s) != n) break;这一行，或者把它改成 n = n > strlen(s) ? n : strlen(s); 去掉fflush(stdin)这一行  至于逻辑，正确的做法应该是for(0到k)循环来计算tem，也就是重复k次，但这样做效率太低。你现在的逻辑直接用第一次指令后的x，y重复k-1，再计算最后一次指令的最大tem，好像是没问题的，主要是怎么证明这中间重复的k-1次没有出现最大的tem，能证明就没问题。

user: user-2
content: scanf("%d%", &T); 这个输入格式有问题吧，你确定你是以 数字% 这样的格式来输入？

user: user-0
content: 引用 8 楼 user-2的回复:因为有清空缓存了，if (strlen(s) != n) break; //输入长度保证一致 这行可以不要 谢谢前辈！然鹅按照你的代码修改以后依然显示答案错误，应该是我逻辑有问题，我自己再找找吧，不必麻烦你啦！晚安

user: user-2
content: 因为有清空缓存了，if (strlen(s) != n) break; //输入长度保证一致 这行可以不要

user: user-2
content: 引用 6 楼 qq_45855517 的回复:1.已修改 2.这个是OJ控制的输入，可以保证。把default改回case以后还是答案错误  算法对不对没太细看，但是我想表达的是这个意思（在注释里） int main(int argc, const char * argv[]) {     int T, n, i, j;     long long tem, k, y, x;     char s[100001];     scanf("%d", &T);     if (T < 0) return -1;     long long *ans = (long long*)malloc(sizeof(long long)*T); //ans要用long long，因为tem是long long     for (i = 0; i < T; i++)     {         y = 0, x = 0;         tem = 0;         scanf("%d%lld", &n, &k); //题目要求分两行         if (n > 100000) break;         while (getchar()!='\n');         memset(s, '\0', sizeof(s));         fgets(s, n+1, stdin); //输入长度保证一致         if (strlen(s) != n) break; //输入长度保证一致         for (j=0; j<n; j++)         {             switch (s[j])             {                 case 'U':y++; break;                 case 'D':y--; break;                 case 'R':x++; break;                 case 'L':x--; break;                 default: break; //如果是别的指令则忽略             }             tem = (tem >abs(x) + abs(y)) ? tem : abs(x) + abs(y);         }                  y *= (k - 1);         x *= (k - 1);         for (j=0; j<n; j++)         {             switch (s[j])             {                 case 'U':y++; break;                 case 'D':y--; break;                 case 'R':x++; break;                 case 'L':x--; break;                 default: break;             }             tem = (tem >abs(x) + abs(y)) ? tem : abs(x) + abs(y);         }         ans[i] = tem; //这里如果用int会丢失精度导致结果不对         fflush(stdin); //清空缓存，否则有脏数据，如果上面输入长度保证一致也是为了避免脏数据     }          for (i = 0; i < T; i++)         printf("%lld\n", ans[i]);          free(ans);     return 0; }

user: user-0
content: 引用 5 楼 user-2的回复:具体算法没细看，但 for (m = 0;m < strlen(s); m++) s[m] = '\0'; 这样肯定不对，s[0]='\0'后，strlen(s)肯定是0，这个循环没意义 memset(s, '\0', sizeof(s));  我想说的是 scanf("%d%lld%s", &n, &k, s); //这里输入的n怎么保证不超过s字符串的长度 如果超过s的长度 switch (s[j]) 都会走入case的default，是你想要的结果吗？ 1.已修改 2.这个是OJ控制的输入，可以保证。把default改回case以后还是答案错误

user: user-2
content: 具体算法没细看，但 for (m = 0;m < strlen(s); m++) s[m] = '\0'; 这样肯定不对，s[0]='\0'后，strlen(s)肯定是0，这个循环没意义 memset(s, '\0', sizeof(s));  我想说的是 scanf("%d%lld%s", &n, &k, s); //这里输入的n怎么保证不超过s字符串的长度 如果超过s的长度 switch (s[j]) 都会走入case的default，是你想要的结果吗？

user: user-0
content: 引用 3 楼 user-2的回复:n和s的长度保证一致吗？比如n大于输入的s的长度时（s每次不清空，是否内存有垃圾数据），会不会导致后面计算是不是就不对了？而且switch如果不在case范围，是否需要特别处理？ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { 	int T, n, i, j,m, ans[100001]; 	long long tem, k, y, x; 	char s[100001]; 	scanf("%d", &T); 	for (i = 0; i < T; i++) 	{ 		y = 0, x = 0; 		tem = 0; 		for (m = 0;m < strlen(s); m++) 			s[m] = '\0'; 		scanf("%d%lld%s", &n, &k, s); 		for (j = 0; j<n; j++) 		{ 			switch (s[j]) 			{ 			case 'U':y++; break; 			case 'D':y--; break; 			case 'R':x++; break; 			default :x--; break; 			} 			tem = (((tem) >(abs(x) + abs(y))) ? (tem) : (abs(x) + abs(y))); 		} 		y *= (k - 1); 		x *= (k - 1); 		for (j = 0; j<n; j++) 		{ 			switch (s[j]) 			{ 			case 'U':y++; break; 			case 'D':y--; break; 			case 'R':x++; break; 			default:x--; break; 			} 			tem = (((tem) >(abs(x) + abs(y))) ? (tem) : (abs(x) + abs(y))); 		} 		ans[i] = tem; 	} 	for (i = 0; i < T; i++) 		printf("%d\n", ans[i]); 	return 0; } 改成这样了，成答案错误了呜呜呜

user: user-2
content: n和s的长度保证一致吗？比如n大于输入的s的长度时（s每次不清空，是否内存有垃圾数据），会不会导致后面计算是不是就不对了？而且switch如果不在case范围，是否需要特别处理？

user: user-0
content: 引用 1 楼 user-2的回复:scanf("%d%", &T); 这个输入格式有问题吧，你确定你是以 数字% 这样的格式来输入？ 多打了个%，谢谢哈😁可是删掉以后还是运行时错误😭😭😭