, вероятно, вы хотите:
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';
, иначе для останавливается на первом символе, несовместимом с тестом, и потому что ваш ввод начинается с пробела для [ 1110] немедленно останавливается.
Дополнительное замечание: не используйте код 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
Обратите внимание, что также возможно изменить копию исходной строки (поэтому не используйте константную ссылку об этом) удаление нежелательных символов, а не создавать другую строку
IsPostBack отсутствует - все это либо POST, либо GET (или другой HTTP-глагол). Вы можете ограничить HTTP-глаголы, которые разрешено вашим действием, то есть вы никогда не увидите запрос от запрещенного глагола, используя атрибут AcceptVerbsAttribute. Например, следующее разрешает только POST.
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult Update( int id )
{
}
Если вам нужно, чтобы одно и то же имя действия выполняло и GET / POST, и они на самом деле делают разные вещи, вы можете либо дать им отдельные подписи, либо использовать ActionNameAttribute для псевдонима одного из действий. поэтому методы могут иметь разные имена.
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult List()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List( string filter, int page, int limit )
{
}
ИЛИ
[ActionName( "List" )]
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult ListDisplay()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List()
{
}
РЕДАКТИРОВАТЬ : обратите внимание, что я добавил проверку токена антиподделения в действия POST. Вы действительно должны использовать это для защиты от межсайтовых скриптовых атак .
Контроллеры не наследуются от System.Web.UI.Page. Свойство isPostback отсутствует.
Среда MVC не поддерживает классическую обратную передачу и представление состояния, используемые в веб-формах. Итак, нет, у вас нет доступа к IsPostBack.
Я советую вам иметь две ветки: одну с текущим сайтом, куда вы добавляете исправления для известных ошибок, и другую, где вы создаете новый сайт. с нуля. Новые функции должны быть реализованы в этом. Я предполагаю, что большая часть вашей кодовой базы повторно используется на новом сайте.
Когда новый сайт будет готов, запустите его.
Почему вы пытаетесь получить это значение из контроллера? Не уверен, поможет ли это вам, но вы все равно можете использовать традиционный объект Request для получения информации, которая была отправлена формой ...
Я не уверен, правильно ли я понял ваш вопрос, но на контроллере у вас будет действие, которое обрабатывает начальный GET из браузера и второе действие для обработки POST.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(MyModel model)
{...}
public ActionResult Create()
{...}
Я определенно посмотрю на это сообщение в блоге Скотта Хансельмана, где он помещает страницу aspx в приложение MVC.
Ваши контроллеры не будут иметь доступа к свойству ViewState. Даже если вы хотите решить проблему с __VIEWSTATE, вам придется проделать некоторую работу, чтобы привести ее в удобную форму в контроллере mvc. Удачи в разработке стратегии конверсии, независимо от того, как она работает, многим было бы интересно узнать, с какими проблемами вы столкнетесь в этом процессе.