在 cpp 中验证路径:无法使用 ASCII 代码删除特殊字符


for(i=0,j=0; (((temp[i] >= 0x2F) && (temp[i] <= 0X39)) || 
((temp[i] >= 0x40) && (temp[i] <= 0x5A)) || 
((temp[i] >= 0x61) && (temp[i] <= 0x7A))) ;i++) {
printf("n%c validnn",temp[i]);
msg[j++] = temp[i];
}
msg[j] = '';

在此片段中,我无法忽略(点),空格和换行符,请帮助您输入。

安慰:

输入:" ,,,,/存储/sdcard0/...融合日志">

最终输出:(空)

您可能想要:

for(i=0,j=0; temp[i] != 0 ;i++) {
if (((temp[i] >= 0x2F) && (temp[i] <= 0X39)) || 
((temp[i] >= 0x40) && (temp[i] <= 0x5A)) || 
((temp[i] >= 0x61) && (temp[i] <= 0x7A))) {
printf("n%c validnn",temp[i]);
msg[j++] = temp[i];
}
}
msg[j] = '';

否则,for 在第一个字符上停止与测试不兼容,并且由于您的输入以空格开头,因此for会立即停止。

另外,不要使用 ascii 代码,直接使用 char(例如 '.'),并且您也有像isspace等函数不会链接到给定的代码。

因此,如果您仍想使用相同的测试,请执行以下操作:

if (((temp[i] >= '/') && (temp[i] <= '9')) || 
((temp[i] >= '@') && (temp[i] <= 'Z')) || 
((temp[i] >= 'a') && (temp[i] <= 'z'))) {

如您所见,这更具可读性,但这仍然对字符代码排序进行了假设,因为您假设"0"紧随"/"等之后。

如果您的目标是只让字母数字字符更多/和 @ 这样做:

if (isalnum(temp[i]) || (temp[i] == '/') || (temp[i] == '@')) {

例:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
char * filter(const char * temp)
{
char * msg = new char[strlen(temp)];
size_t i, j;
for (i=0,j=0; temp[i] != 0 ;i++) {
if (isalnum(temp[i]) || (temp[i] == '/') || (temp[i] == '@')) {
printf("n%c validnn",temp[i]);
msg[j++] = temp[i];
}
}
msg[j] = '';
return msg;
}
int main()
{
char * s = filter(" n n ,,,,/storage/ sdcard0/ ... fusionlogs");
puts(s);
delete [] s;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra p.c
pi@raspberrypi:/tmp $ ./a.out
/ valid

s valid

t valid

o valid

r valid

a valid

g valid

e valid

/ valid

s valid

d valid

c valid

a valid

r valid

d valid

0 valid

/ valid

f valid

u valid

s valid

i valid

o valid

n valid

l valid

o valid

g valid

s valid
/storage/sdcard0/fusionlogs

但是我们在C++所以另一种可能性是使用std::string,我没有在上面使用,因为您的msg[j] = '';清楚地表明您使用 C 数组。

例:

#include <ctype.h>
#include <string>
#include <iostream>
std::string filter(const std::string & temp)
{
std::string msg;
for (auto c : temp) {
if (isalnum(c) || (c == '/') || (c == '@')) {
std::cout << c << " valid" << std::endl; // it is useless to produce 3 newlines
msg.push_back(c);
}
}
return msg;
}
int main()
{
std::string s = filter(" n n ,,,,/storage/ sdcard0/ ... fusionlogs");
std::cout << s << std::endl;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra p.c
pi@raspberrypi:/tmp $ ./a.out
/ valid
s valid
t valid
o valid
r valid
a valid
g valid
e valid
/ valid
s valid
d valid
c valid
a valid
r valid
d valid
0 valid
/ valid
f valid
u valid
s valid
i valid
o valid
n valid
l valid
o valid
g valid
s valid
/storage/sdcard0/fusionlogs

请注意,也可以修改初始字符串的副本(因此不使用它的 const 引用)删除非预期字符,而不是创建其他字符串

最新更新