如何在C中检查字符串是否包含有效字符?

如何在C中检查字符串是否包含有效字符?,c,arrays,parsing,error-handling,character,C,Arrays,Parsing,Error Handling,Character,因此,我们有一个标记器的代码,它是公认的有点坏的 现在我们不能修改这个函数 不过,它为大多数情况提供了正确的输出。除了在某些情况下,它会在结尾添加随机的额外垃圾 现在,程序读入一个字符串,并将其转换为树以执行。最底部的节点包含简单的命令 这些简单的命令必须经过解析才能执行 现在,在解析过程中,最后的多余垃圾会妨碍execvp()调用 我想征求关于如何在最后消除垃圾的建议 我曾想过使用正则表达式来检查字符串是否包含有效字符,我很好奇是否有任何标准库函数可以在这方面提供帮助 如果有什么区别的话,垃圾

因此,我们有一个标记器的代码,它是公认的有点坏的

现在我们不能修改这个函数


不过,它为大多数情况提供了正确的输出。除了在某些情况下,它会在结尾添加随机的额外垃圾

现在,程序读入一个字符串,并将其转换为树以执行。最底部的节点包含简单的命令

这些简单的命令必须经过解析才能执行

现在,在解析过程中,最后的多余垃圾会妨碍execvp()调用

我想征求关于如何在最后消除垃圾的建议

我曾想过使用正则表达式来检查字符串是否包含有效字符,我很好奇是否有任何标准库函数可以在这方面提供帮助

如果有什么区别的话,垃圾角色就像一个盒子,上面有

00
19
作为它的内容。它显示在gedit中,但不显示在此处。垃圾打印的来源是第一次解析,更改它是不可行的

下面是该程序的运行示例

sgml@SGML3:~/smelly-fish$ ./timetrash exectest
 Word is: expr 3 + 8 + 9 + 8  (Junk - this character won't display)
 Temp is: expr 3 + 8 + 9 + 8  (Junk - this character won't display)
c->u.word[0] is expr
c->u.word[1] is 3
c->u.word[2] is +
c->u.word[3] is 8
c->u.word[4] is +
c->u.word[5] is 9
c->u.word[6] is +
c->u.word[7] is 8
c->u.word[8] is  (Junk - this character won't display)
c->u.word[9] is (null)
expr: syntax error
Command is: SIMPLE_COMMAND
 Word is:  expr 7 + 8 + 9 + 8  (Junk - this character won't display)
 Temp is:  expr 7 + 8 + 9 + 8 (Junk - this character won't display)
c->u.word[0] is expr
c->u.word[1] is 7
c->u.word[2] is +
c->u.word[3] is 8
c->u.word[4] is +
c->u.word[5] is 9
c->u.word[6] is +
c->u.word[7] is 8
c->u.word[8] is (Junk - this character won't display)
c->u.word[9] is (null)
expr: syntax error
Command is: SIMPLE_COMMAND
sgml@SGML3:~/smelly-fish$ ./timetrash exectest >execresults1.txt
expr: syntax error
expr: syntax error
sgml@SGML3:~/smelly-fish$ ./timetrash exectest
 Word is: expr 3 + 8 + 9 + 8 (Junk - this character won't display)  
 Temp is: expr 3 + 8 + 9 + 8    (Junk - this character won't display) 
c->u.word[0] is expr
c->u.word[1] is 3
c->u.word[2] is +
c->u.word[3] is 8
c->u.word[4] is +
c->u.word[5] is 9
c->u.word[6] is +
c->u.word[7] is 8
c->u.word[8] is (Junk - this character won't display)   
c->u.word[9] is (null)
expr: syntax error
Command is: SIMPLE_COMMAND
 Word is:  expr 7 + 8 + 9 + 8 
 Temp is:  expr 7 + 8 + 9 + 8 
c->u.word[0] is expr
c->u.word[1] is 7
c->u.word[2] is +
c->u.word[3] is 8
c->u.word[4] is +
c->u.word[5] is 9
c->u.word[6] is +
c->u.word[7] is 8
c->u.word[8] is 
c->u.word[9] is (null)
expr: syntax error
Command is: SIMPLE_COMMAND
sgml@SGML3:~/smelly-fish$ 

“在末尾添加随机的额外垃圾”-听起来像是缓冲区溢出问题。如果不修复它,你只会自找麻烦。我的想法也是如此,标记器并没有在标记字符串结尾的末尾附加/0字符,而是将标记的值加上同样多的字符留给你,直到a/0恰好稍后出现在内存中,这给你留下了一堆额外的字符。除了固定标记器(或者可能固定捕获标记的字符数组的大小,可能它没有足够的空间来包含结束字符?)之外,没有任何简单的方法来解决这个问题。由4位数字(2比2)的框组成的字符是无法显示的Unicode字符;数字(在您的例子中是
0019
)是十六进制代码。你的似乎是控制字符“媒体结束”。不管它是应该存在的还是溢出的结果,没有看到代码就无法判断。那么有没有办法对这个特殊字符进行剥离检查?我意识到这是自找麻烦,但我们现在需要一个快速而肮脏的解决方案。就像这一行-c->u.word[8]是(垃圾-这个字符不会显示)。如果可以检查此异常,则可以为数组指定正确的值。