二进制字符串连续01/10对计数问题及代码调试求助
问题分析与代码修正
原代码存在的问题
- 数组类型错误:把存储二进制字符串的数组
S定义成了int类型,实际应该用char类型来存储字符。 - 字符串输入方式错误:在循环里多次调用
scanf("%s", &S)读取单个字符,这会每次读取整个字符串覆盖之前内容,正确做法是一次性读取完整的二进制字符串。 - 统计循环逻辑错误:
- 统计连续对时,循环范围应该到
N-2(要访问S[j+1],避免数组越界)。 - 每个测试用例开始时没重置
count,会导致不同测试用例的结果累加,输出错误数值。
- 统计连续对时,循环范围应该到
- 输出时机错误:在字符循环内部就打印
count,会输出中间值而非最终统计结果,应该在每个测试用例统计完成后再输出。
修正后的代码
#include <stdio.h> #include <string.h> int main() { int T, N, i, j, count; // 定义足够大的char数组存储字符串,N最大1000,留1位给字符串结束符 char S[1001]; scanf("%d", &T); for (i = 0; i < T; i++) { scanf("%d", &N); // 一次性读取完整的二进制字符串 scanf("%s", S); // 每个测试用例开始时重置计数器 count = 0; // 循环到N-2,避免访问S[N]导致越界 for (j = 0; j < N - 1; j++) { // 判断当前字符和下一个字符是否是01或10组合 if ((S[j] == '0' && S[j+1] == '1') || (S[j] == '1' && S[j+1] == '0')) { count++; } } // 每个测试用例统计完成后输出结果 printf("%d\n", count); } return 0; }
修正点说明
- 数组类型调整:将
int S[100]改为char S[1001],适配字符串存储需求,同时保证长度足够容纳最大长度的输入字符串。 - 输入方式修正:移除读取单个字符的循环,直接用
scanf("%s", S)读取完整的二进制字符串。 - 计数器重置:在每个测试用例的统计循环前,将
count重置为0,确保每个测试用例的统计独立。 - 循环范围修正:统计循环的上限改为
N-1,避免数组越界访问。 - 输出时机调整:将
printf移到测试用例的统计循环之后,输出最终的统计结果。
内容的提问来源于stack exchange,提问作者ZABIA HOSSAIN
相关产品推荐
相关产品推荐

