вероятно, вы хотите:
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 valid\n\n",temp[i]);
msg[j++] = temp[i];
}
}
msg[j] = '\0';
, иначе для останавливается на первом символе, несовместимом с тестом, а также потому, что ваш ввод начинается с пробела для немедленно останавливается.
Дополнительное замечание, не используйте код 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 valid\n\n",temp[i]);
msg[j++] = temp[i];
}
}
msg[j] = '\0';
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] = '\0';
ясно указывает на то, что вы используете 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
Обратите внимание, что также возможно изменить копию исходной строки (поэтому не используйте константную ссылкуоб этом) удаление нежелательных символов, а не создание другой строки