如何测试字符串中的某些符号?(C#)
作为大学项目的一部分,我正在尝试为自己的语言制作一个编译器,在编写模块以确定字符串中输入的类型(字母、数字、分隔符等)时遇到了这个问题 当我到达第一个if语句时,它返回以下错误: mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常 附加信息:对象必须是Char类型 我不知道如何解决这个问题,因为我使用char进行测试,不知道错误所指的是哪个对象如何测试字符串中的某些符号?(C#),c#,C#,作为大学项目的一部分,我正在尝试为自己的语言制作一个编译器,在编写模块以确定字符串中输入的类型(字母、数字、分隔符等)时遇到了这个问题 当我到达第一个if语句时,它返回以下错误: mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常 附加信息:对象必须是Char类型 我不知道如何解决这个问题,因为我使用char进行测试,不知道错误所指的是哪个对象 感谢阅读,非常感谢您的帮助^ ^因为您使用了字符串的引号,所以出现了错误。使用单引号 String s
感谢阅读,非常感谢您的帮助^ ^因为您使用了字符串的引号,所以出现了错误。使用单引号
String s = "String";
char c = 'c';
您得到错误是因为您使用了字符串的引号。使用单引号
String s = "String";
char c = 'c';
在双引号“asdf…”之间写入的任何内容都是字符串文字。 如果需要字符文字,请使用单引号
'a'
private static void readChar(ref string sentence, ref int inputType)
{
foreach (char test in sentence)
{
if ((test.CompareTo('|') == 0) |
(test.CompareTo('*') == 0) |
(test.CompareTo('/') == 0) |
(test.CompareTo('+') == 0) |
(test.CompareTo('-') == 0) |
(test.CompareTo('@') == 0) |
(test.CompareTo('#') == 0) |
(test.CompareTo('$') == 0) |
(test.CompareTo('%') == 0) |
(test.CompareTo('^') == 0) |
(test.CompareTo('&') == 0) |
(test.CompareTo('(') == 0) |
(test.CompareTo(')') == 0) |
(test.CompareTo(',') == 0) |
(test.CompareTo('`') == 0) |
(test.CompareTo('=') == 0))
{
......
在双引号“asdf…”之间写入的任何内容都是字符串文字。 如果需要字符文字,请使用单引号
'a'
private static void readChar(ref string sentence, ref int inputType)
{
foreach (char test in sentence)
{
if ((test.CompareTo('|') == 0) |
(test.CompareTo('*') == 0) |
(test.CompareTo('/') == 0) |
(test.CompareTo('+') == 0) |
(test.CompareTo('-') == 0) |
(test.CompareTo('@') == 0) |
(test.CompareTo('#') == 0) |
(test.CompareTo('$') == 0) |
(test.CompareTo('%') == 0) |
(test.CompareTo('^') == 0) |
(test.CompareTo('&') == 0) |
(test.CompareTo('(') == 0) |
(test.CompareTo(')') == 0) |
(test.CompareTo(',') == 0) |
(test.CompareTo('`') == 0) |
(test.CompareTo('=') == 0))
{
......
CompareTo
方法接受一个char进行比较。您正在传入一个字符串。
对
'char'
使用单引号对
字符串使用双引号比较方法接受字符进行比较。您正在传入一个字符串。
对'char'
使用单引号
对字符串使用双引号
private static void ReadChar(string sentence, ref int inputType)
{
foreach (char test in sentence) {
if ("|*/+-@#$%^&(),`=".Contains(test)) {
inputType = 5;
} // delimiter
else if (Char.IsDigit(test)) {
inputType = 3;
} // numeric
else if (Char.IsWhiteSpace(test)) {
inputType = 6;
} // space
else if (test == ';') {
inputType = 7;
} // semicolon
else {
inputType = 1;
} // end alpha
}
}
只是一个简单的建议:
private static void ReadChar(string sentence, ref int inputType)
{
foreach (char test in sentence) {
if ("|*/+-@#$%^&(),`=".Contains(test)) {
inputType = 5;
} // delimiter
else if (Char.IsDigit(test)) {
inputType = 3;
} // numeric
else if (Char.IsWhiteSpace(test)) {
inputType = 6;
} // space
else if (test == ';') {
inputType = 7;
} // semicolon
else {
inputType = 1;
} // end alpha
}
}
您可以使用Char.IsDigit('9')
可以使用双“| |”,单“|”没有意义。为什么字符串参数ref
?在循环中多次更新ref int
参数有什么用?是否有任何东西试图以同样快的速度读取这个int变量?一个想法是切换(测试){…}
,然后为每个“输入类型”(5
,3
,6
,等等)设置一个切换块(每个块上都有许多大小写
)。谢谢你的建议。对C#还是很陌生,所以要习惯它。你可以使用Char.IsDigit('9')
可以使用双“| |”,单“|”没有意义。为什么字符串参数ref
?在循环中多次更新ref int
参数有什么用?是否有任何东西试图以同样快的速度读取这个int变量?一个想法是切换(测试){…}
,然后为每个“输入类型”(5
,3
,6
,等等)设置一个切换块(每个块上都有许多大小写
)。谢谢你的建议。对C还是比较陌生,所以还是习惯吧。最好在两个char
值之间使用=
.CompareTo
用于常规排序,而不是相等检查。最好在两个char
值之间使用=
.CompareTo
用于常规排序,而不是相等检查。“|*/+-@$%^&(),`=“.Contains(test)
经过Linq(并使用字符串实现IEnumerable
)的事实),因此不要忘记使用System.Linq此解决方案的代码>指令。为了避免Linq,您可以说“|*/+-@$%^&(),`=“.IndexOf(test)!”-1
,但Linq很好。“|*/+-@$%^&(),`=“.Contains(test)
通过Linq(并使用string
实现IEnumerable
)的事实),所以不要忘记使用System.Linq此解决方案的代码>指令。为了避免Linq,您可以说“|*/+-@$%^&(),`=“.IndexOf(test)!”-1
,但Linq很好。