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 引用)删除非预期字符,而不是创建其他字符串