【问题标题】:StringToASCII from scratch failedStringToASCII 从头开始​​失败
【发布时间】:2016-12-22 23:15:33
【问题描述】:

我实际上尝试在 c# 中从头开始创建一个 StringToASCII 函数。

我从 _myString 获得输入,这是代码:

public void convertToASCII() {
    //A-Z --> 65-90
    //a-z --> 97-122
    //0-9 --> 48-57
    //Space --> 32

    int[] returnString = new int[_myString.Length];
    int iTableau = 0;
    char iAZ = 'A';
    char iaz = 'a';
    char i09 = '0';
    char iSpace = ' ';

    for(int i = 0; i < _myString.Length; i++)
    {
        if(_myString[i] >= 65 && _myString[i] <= 90 || _myString[i] >= 97 && _myString[i] <= 122 || _myString[i] >= 48 && _myString[i] <= 57 || _myString[i] == 32)
        {
            while(iAZ < 90 || iaz < 122 || iaz < 122 || i09 < 57 || _myString[i] == 32)
            {
                if(_myString[i] == iAZ && iAZ >= 'A' && iAZ <= 'Z')
                {
                    returnString[iTableau] = iAZ;
                    iTableau++;
                    iAZ--;
                }
                else
                {
                    iAZ++;
                }
                if(_myString[i] == iaz && iaz >= 'a' && iaz <= 'z')
                {
                    returnString[iTableau] = iaz;
                    iTableau++;
                    iaz--;
                }
                else
                {
                    iaz++;
                }
                if(_myString[i] == i09 && i09 >= '0' && i09 <= '9')
                {
                    returnString[iTableau] = i09;
                    iTableau++;
                    i09--;
                }
                else
                {
                    i09++;
                }
                if(_myString[i] == iSpace)
                {
                    returnString[iTableau] = iSpace;
                    iTableau++;
                }
            }
        }
    }

    _myString = "";

    for (int i = 0; i < returnString.Length; i++)
    {
        _myString += returnString[i];
    }
}

我也尝试过这种可行的功能,但我想创建一个只检查 A-Z 和 a-z 以及 0-9 和空格的字符。

和第一个函数一样,我从一个名为“_myString”的全局字符串变量中获取输入。

public void convertToASCII()
{
    string asciiChar;
    string returnString = "";

    foreach (char c in _myString)
    {
        asciiChar= ((int)(c)).ToString();
        returnString += " " + asciiChar;
    }
    _myString = returnString;
}

【问题讨论】:

  • 这里有问题吗?
  • “仅检查”是什么意思?您如何处理超出这些范围的字符?只是省略它们?使用替换字符? Encoding.ASCII 怎么了?
  • @itsme86 首先感谢您的快速响应,我只想检查 _myString[i] 是否在这些范围内,然后我将它们放入一个数组中,然后再重新组合。跨度>
  • @itsme86 我对 Encoding.ASCII 的问题是我的编程老师告诉我,我不必使用这个函数,而是创建它。
  • 您能否重组问题,使其具有一个 minimal reproducible example 来演示当前的错误行为以及您希望它如何表现?理想情况下可以复制/粘贴到控制台应用程序并进行测试的东西?您的代码无法按原样编译,请参阅 dotnetfiddle.net/ANEpTN

标签: c# string type-conversion ascii


【解决方案1】:

这个其实比较简单:

public string StringToLettersOrNumbersOrSpace(string input)
{
    var sb = new StringBuilder();

    for (int i = 0; i < input.Length; i++)
    {
        if (Char.IsLetterOrDigit(input[i]) || input[i] == ' ')
        {
            sb.Append(input[i]);
        }
    }

    return sb.ToString();
}

首先,您需要使用StringBuilder,而不是连续附加到字符串变量。 C# 中的字符串是不可变的,这意味着它们在创建后无法更改,因此执行string s1 = "aaa"; s1 += "bbb"; 之类的操作实际上会创建一个全新的字符串,而不仅仅是添加到原始字符串。另一方面,StringBuilder 是可变的,因此您不必担心每次要连接字符串时重新分配一堆字符串(随着字符串变大,它会越来越慢)。

其次,您可以使用Char.IsLetterOrDigit 而不是使用比较。该方法将char 作为输入,如果字符是字母(大写或小写)或数字,则返回true。这直接映射到您想要的范围a-zA-Z0-9。但是,由于您还关心空间,因此您必须手动检查。

【讨论】:

  • msdn.microsoft.com/en-us/library/cay4xx2f(v=vs.110).aspx - 建议使用 IsLetterOrDigit 来检测 ASCII 字母绝对没有意义(我也有点支持使用无效解决方案来拖钓 OP - 但它看起来不是你的目标)。
  • @AlexeiLevenkov 你读过问题正文吗? OP 的目标是专门获取a-zA-Z0-9 范围内的字母和空格字符。
  • 我没有看到任何隐蔽字母和数字的要求 - 即你能解释一下'Ф' 应该如何用 ASCII 字符串 (Char.IsLetterOrDigit('Ф') == true) 表示吗?
  • @AlexeiLevenkov i would like to make one who checks only chars from A-Z and a-z and 0-9 and space. 他就在那儿说。
  • @VetonSadiku 那你真的应该等到你有时间了。错误形式的问题通常会得到错误的答案或没有答案,甚至可能被关闭或搁置。如果您必须稍后再回来重新表述所有内容,这最终会有点浪费时间。
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多