拆分字符串然后解析为整数

时间:2015-06-09 20:05:58

标签: c# .net

这是我正在做的练习:

编写一个程序,将abcd格式的四位数作为输入(例如2011)并执行以下操作:

•计算数字的总和(在我们的示例中为2 + 0 + 1 + 1 = 4)。

•在控制台上以相反顺序打印数字:dcba(在我们的示例中为1102)。

•将最后一位数字放在第一个位置:dabc(在我们的例子中为1201)。

•交换第二个和第三个数字:acbd(在我们的示例中为2101)。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string FourDigitNum = Console.ReadLine();
            string[] digits = FourDigitNum.Split();
            int firstDigit = int.Parse(digits[0]);
            int secondDigit = int.Parse(digits[1]);
            int thirdDigit = int.Parse(digits[2]);
            int fourthDigit = int.Parse(digits[3]);
            int sum = firstDigit + secondDigit + thirdDigit + fourthDigit;
            string reversed = digits[3] + digits[2] + digits[1] + digits[0];
            string lastCharFirst = digits[3] + digits[0] + digits[1] + digits[0];
            string exchanged = digits[0] + digits[2] + digits[1] + digits[3];
            Console.WriteLine("The Sum is: {0}", sum);
            Console.WriteLine("The Reversed number is: {0}", reversed);
            Console.WriteLine("The Last Digit is First: {0}", lastCharFirst);
            Console.WriteLine("The Second and Third Digit Exchanged: {0}", exchanged);
        }
    }
}

我使用1100作为输入时得到的错误是:

  

未处理的异常:System.IndexOutOfRangeException:索引是   在阵列的boun ds之外。在   ConsoleApplication6.Program.Main(String [] args)in   c:\ Users \ User1 \ Document s \ Visual Studio   2013 \ Projects \ ConsoleApplication6 \ Program.cs:第16行

编辑:非常感谢,我误解了Split();工作。这是我最后的工作代码:

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string digits = Console.ReadLine();
            int firstDigit = (int)Char.GetNumericValue(digits[0]);
            int secondDigit = (int)Char.GetNumericValue(digits[1]);
            int thirdDigit = (int)Char.GetNumericValue(digits[2]);
            int fourthDigit = (int)Char.GetNumericValue(digits[3]);
            int sum = firstDigit + secondDigit + thirdDigit + fourthDigit;
            Console.WriteLine("The Sum is: {0}", sum);
            Console.WriteLine("The Reversed number is: {3}{2}{1}{0}", firstDigit, secondDigit, thirdDigit, fourthDigit);
            Console.WriteLine("The Last Digit is First: {3}{0}{1}{2}", firstDigit, secondDigit, thirdDigit, fourthDigit);
            Console.WriteLine("The Second and Third Digit Exchanged: {0}{2}{1}{3}", firstDigit, secondDigit, thirdDigit, fourthDigit);
        }
    }
}

9 个答案:

答案 0 :(得分:5)

不需要Split,您假设通过执行Split()它会将每个字符拆分为字符串数组的元素。不是,Split()没有任何参数会在空白字符上拆分,因为在你的字符串1102中你没有任何空格字符,你将得到一个单元素数组。因此例外。

使用字符串作为字符数组,您可以访问每个索引并通过连接字符创建反向字符串。还要学习调试和单步执行代码,这将有助于您排除代码故障。

作为提示使用:

int firstDigit = (int) Char.GetNumericValue(FourDigitNum[0]);

答案 1 :(得分:3)

" IndexOutOfRangeException"表示您尝试访问超出范围的集合元素。在这种情况下,索引1超出了数组digits的范围。

您可以使用调试器检查数组中的内容。方便的是,当你在visual studio中遇到未捕获的异常时,它通常会为你创建一个断点。

debugger

*"当地人"选项卡当前已被选中,但您可以选择" Watch"如果您想编写自己的表达式,请参阅Visual Studio Debugging Tutorial

如您所见,digits数组只包含1个元素digits[0],其中包含您的整个输入。

至于如何实际获取字符串数字列表,有很多方法可以做到,这里有一个简单的方法。

string[] digits = FourDigitNum.ToCharArray().Select(c => c.ToString()).ToArray();

现在如果你在学校这样做,你的老师可能会对你使用Select声明产生怀疑,但是我会把另一种方法作为练习给你。

答案 2 :(得分:2)

问题在于

string[] digits = FourDigitNum.Split();

假设您有1100作为输入。你认为这会给[1,1,0,0],但它会给你[1100]

你应该把它改成

string digits = Console.ReadLine();

string.Split()将分隔字符串,假设空格为分隔符。

答案 3 :(得分:0)

当你这样做时

string[] digits = FourDigitNum.Split();

它只返回一个只包含一个项目的数组。拆分不会按照您的意图发生,这就是为什么当您尝试

时出现Index was outside the bounds of the array错误的原因
int secondDigit = int.Parse(digits[1]);

答案 4 :(得分:0)

你在这里误解了字符串用法。 String的核心也是一组字符。您可以通过索引直接访问这些字符。

您的代码应如下所示:

    static void Main(string[] args)
    {
        string digits = Console.ReadLine();
        int firstDigit = Convert.ToInt32(digits[0]);
        int secondDigit = Convert.ToInt32(digits[1]);
        int thirdDigit = Convert.ToInt32(digits[2]);
        int fourthDigit = Convert.ToInt32(digits[3]);
        int sum = firstDigit + secondDigit + thirdDigit + fourthDigit;
        string reversed = digits[3] + digits[2] + digits[1] + digits[0];
        string lastCharFirst = digits[3] + digits[0] + digits[1] + digits[0];
        string exchanged = digits[0] + digits[2] + digits[1] + digits[3];
        Console.WriteLine("The Sum is: {0}", sum);
        Console.WriteLine("The Reversed number is: {0}", reversed);
        Console.WriteLine("The Last Digit is First: {0}", lastCharFirst);
        Console.WriteLine("The Second and Third Digit Exchanged: {0}", exchanged);
    }

Look here for more information on the String class

答案 5 :(得分:0)

你的FourDigitNum.Split()没有做你想要的。不是将每个数字拆分成数组,而是最终得到一个包含1个元素的数组,即4位数。

更改

string[] digits = FourDigitNum.Select(digit => digit.ToString()).ToArray();

using System.Linq; 

确保你有

using

使用您的其他2011 The Sum is: 4 The Reversed number is: 1102 The Last Digit is First: 1202 The Second and Third Digit Exchanged: 2101 声明,其余代码可以保持不变。

结果:

IAppBuilder

答案 6 :(得分:0)

没有要分割的已定义字符。你可以通过下面的字符串中的每个字符:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
class Program
{
    static void Main(string[] args)
    {
        string FourDigitNum = Console.ReadLine();
        List<string> digitsList = new List<string>();
        foreach (char c in FourDigitNum)
        {
            digitsList.Add(c.ToString());
        }
        string[] digits = digitsList.ToArray();
        int firstDigit = int.Parse(digits[0]);
        int secondDigit = int.Parse(digits[1]);
        int thirdDigit = int.Parse(digits[2]);
        int fourthDigit = int.Parse(digits[3]);
        int sum = firstDigit + secondDigit + thirdDigit + fourthDigit;
        string reversed = digits[3] + digits[2] + digits[1] + digits[0];
        string lastCharFirst = digits[3] + digits[0] + digits[1] + digits[0];
        string exchanged = digits[0] + digits[2] + digits[1] + digits[3];
        Console.WriteLine("The Sum is: {0}", sum);
        Console.WriteLine("The Reversed number is: {0}", reversed);
        Console.WriteLine("The Last Digit is First: {0}", lastCharFirst);
        Console.WriteLine("The Second and Third Digit Exchanged: {0}", exchanged);

    }
}

}

答案 7 :(得分:0)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string FourDigitNum = Console.ReadLine();
            int firstDigit = int.Parse(FourDigitNum.SubString(0,1));
            int secondDigit = int.Parse(FourDigitNum.SubString(1,1));
            int thirdDigit = int.Parse(FourDigitNum.SubString(2,1));
            int fourthDigit = int.Parse(FourDigitNum.SubString(3,1));
            int sum = firstDigit + secondDigit + thirdDigit + fourthDigit;
            string reversed = fourthDigit.ToString()  + thirdDigit.ToString()  + secondDigit.ToString()  + firstDigit.ToString();
            string lastCharFirst = fourthDigit.ToString() + firstDigit.ToString() + secondDigit.ToString() + firstDigit.ToString();
            string exchanged = firstDigit.ToString() + thirdDigit.ToString() + secondDigit.ToString() + fourthDigit.ToString();
            Console.WriteLine("The Sum is: {0}", sum);
            Console.WriteLine("The Reversed number is: {0}", reversed);
            Console.WriteLine("The Last Digit is First: {0}", lastCharFirst);
            Console.WriteLine("The Second and Third Digit Exchanged: {0}", exchanged);
        }
    }
}

我没有在机器上检查过,但我认为它应该可行。尝试执行一次。

答案 8 :(得分:-1)

你正在硬编码输入字符串的长度,但是.Split()只在数组中创建一个项目,而不是四个。

您可以将字符串拆分为char数组.ToCharArray()以创建一个数组,其中每个数字都作为数组中的项目。