C#中如何从两个字符串各取2字符生成10组4字符组合?
问题:从两个字符串生成10组4字符组合(每组2+2字符)遇到瓶颈
我来帮你捋清楚当前代码的问题,以及怎么调整才能生成你想要的10组组合~
首先看你遇到的情况:只能生成4组就停止,核心问题出在这两个地方:
1. 索引越界导致程序提前终止
你的内层循环里,ctr每次递增2,然后直接用nchars[ctr]和nchars[ctr2](ctr2=ctr+1)取字符。拿你的示例输入FIRSTNAME来说,它的长度是9(索引范围0-8),当ctr=8时,ctr2=9,这时候访问nchars[9]就会触发索引越界异常,程序直接停掉,所以只能生成ctr=0、2、4、6对应的4组。
2. 循环逻辑完全错误,没法生成新组合
外层的for(i=0;i<=10;i++)完全是多余的——它只会重复执行内层循环11次,让你得到重复的组合,而不是新的组合。而且你当前的逻辑只能从两个字符串的连续位置取2字符,一旦到字符串末尾就没的取了,自然凑不够10组。
解决方案:循环复用字符串字符,确保生成10组
要凑够10组,我们可以用取模运算来循环复用两个字符串的字符,这样就算字符串长度不够,也能循环从头取,直到凑够10组。修改后的代码如下:
using System; public class Program { public static void Main() { Console.WriteLine("Name"); string name = Console.ReadLine(); Console.WriteLine("Lastname"); string lastname = Console.ReadLine(); // 先校验输入,避免字符串太短导致后续出错 if (name.Length < 2 || lastname.Length < 2) { Console.WriteLine("名字和姓氏必须至少包含2个字符哦!"); return; } // 直接循环10次,生成10组组合 for (int i = 0; i < 10; i++) { // 用取模运算计算name中两个字符的索引,实现循环复用 int nameIdx1 = (i * 2) % name.Length; int nameIdx2 = (nameIdx1 + 1) % name.Length; // 同理计算lastname的字符索引 int lastIdx1 = (i * 2) % lastname.Length; int lastIdx2 = (lastIdx1 + 1) % lastname.Length; // 拼接成4字符组合并输出,加上组号 string combo = $"{name[nameIdx1]}{name[nameIdx2]}{lastname[lastIdx1]}{lastname[lastIdx2]}"; Console.WriteLine($"{i+1}{combo}"); } } }
代码说明:
- 用
(i * 2) % 字符串长度计算偏移量:当偏移超过字符串长度时,取模会让它自动回到开头,实现循环复用字符 - 第二个字符的索引是第一个索引+1后再取模:比如字符串长度为9,当第一个索引是8(最后一位),+1后是9,9%9=0,就会取开头的第一个字符,不会越界
- 增加了输入校验:防止用户输入过短的字符串导致错误
- 直接循环10次,每次生成一组新组合,刚好得到你要的10组
用你的示例输入FIRSTNAME和LASTNAME运行,会得到这样的结果:
1FILA
2RSST
3TNNA
4AMME
5EFLA
6IRSN
7STNA
8TNME
9AMEF
10EFST
完全符合你的需求~
内容的提问来源于stack exchange,提问作者Bogdan Darius
相关产品推荐
相关产品推荐

