2009-07-03 4 views
2

У меня есть программа, которая позволяет пользователю ввести номер уровня, а затем он играет, что уровень:Как проверить длину ввода? (C++)

char lvlinput[4]; 
std::cin.getline(lvlinput, 4) 
char param_str[20] = "levelplayer.exe " 
strcat_s(param_str, 20, lvlinput); 
system(param_str); 

И данные уровня хранятся в папках \ 001 \ 002 \ 003, и т. д. и т. д. Однако я не могу сказать, вводил ли пользователь три цифры, например: 1, 01 или 001. И все папки перечислены в виде трехзначных чисел. Я не могу просто проверить длину строки lvlinput, потому что это массив, поэтому как я могу убедиться, что пользователь ввел три цифры?

+0

Почему вы не можете проверить len строки? "LEN = StrLen (lvlinput);" Возможно, вы хотите сделать что-то вроде: snprintf (param_str, 20, «levelplayer.exe% 03d», atoi (lvlinput); » – markets

+1

Что такое snprintf()? – 2009-07-03 21:25:20

+0

http: //linux.die.net/man/3/snprintf – markets

ответ

2

Вот как вы могли бы сделать это в C++:

std::string lvlinput; 
std::getline(std::cin, lvlinput); 
if (lvlinput.size() > 3) { // if the input is too long, there's nothing we can do 
    throw std::exception("input string too long"); 
} 
while (lvlinput.size() < 3) { // if it is too short, we can fix it by prepending zeroes 
    lvlinput = "0" + lvlinput; 
} 
std::string param_str = "levelplayer.exe "; 
param_str += lvlinput; 
system(param_str.c_str()); 

у вас есть хороший класс строк, который заботится о конкатенации, длине и все тех другие неудобных вещей для вас , Так что используйте его.

Обратите внимание, что я использую std::getline вместо cin.getline. Последний записывает ввод в массив символов, а первый записывает в соответствующую строку.

+0

00003 должен быть действительным входом, хотя использование петли для прокладки не кажется правильным. внутренне он должен сдвигать всю строку вниз каждый раз, когда вы добавляете 0. – mpen

+0

Он не сказал, что 00003 должен быть действительным входом, и вы правы, что цикл неэффективен, но имеет ли это значение? Точная проверка данных до OP. Я просто показал, как к нему можно подойти, и как он должен использовать строки C++ вместо массивов char. – jalf

+0

@mark: Мне не очень-то нужно проверять каждую возможную запись (я могу это сделать уже), я просто понятия не имел, как проверить, какая длина строки была до того, как она добавлена ​​в массив символов. – 2009-07-03 21:31:00

7

Вы действительно задаете неправильный вопрос. Изучите класс std :: string C++ и вернитесь сюда.

9

Почему бы не использовать std::string?
Это значительно упрощает хранение, конкатенацию и модификацию.

Если вам нужна строка с-стиль после использования: my_string.c_str()

Вот подсказка: Для того, чтобы ваши персонажи вход 3 длинный, используйте std::insert префикс ваш номер с 0-х.

+0

Мне не нужно делать это на три цифры, мне просто нужно проверить, введен ли пользователь три цифры. – 2009-07-03 21:26:06

+0

Если вам не нужно вводить ввод какой-либо определенной длины, почему вы заботитесь, сколько цифр введено пользователем? В любом случае, первая ссылка, которую я вам дал, должна иметь размер(), чтобы дать вам длину строки. –

2

Что вы имеете в виду, вы не можете проверить длину строки? getline генерирует завершенную NULL c-строку, поэтому просто используйте strlen (lvlinput).

+0

lvlinput уже определен как имеющий длину 3, поэтому, если пользователь вводит 3, 03, 003 или 0003, длина lvlinput всегда равна 3. – 2009-07-03 21:44:18

+0

Как lvlinput определяется как имеющий длину 3? Вы действительно должны потратить некоторое время, чтобы узнать, как строки работают на C++. – Gerald

3

Eh? Зачем им нужно вводить 3 цифры? Почему бы просто не надеть это, если они этого не сделают? Если вы действительно хотите проверить, что они ввели 3 цифры, используйте strlen. Но то, что я рекомендую вам, это atoi их вход, а затем sprintf(cmd, "levelplayer.exe %03d", lvlinput_as_integer)

0

Нейл сказал вам, где вы должны начать, ваш код может выглядеть так.

std::string level, game = "levelplayer.exe "; 

std::cout << "Enter the level number : "; 
std::cin >> level; 

if(level.size() != 3) 
{ 
    // Error! 
} 
else 
{ 
// if you have more processing, it goes here :) 
    game += level; 
    std::system(game.c_str()); 
} 
0

Вы можете проверить длину вашего нуля строки, которая возвращает GetLine с помощью:

int len = strlen(lvlinput); 

Это работает, потому что getline возвращает строку нуля.

Однако, это не относится к вашей проблеме. Если вы хотите держаться подальше от std :: string (и нет особых причин, почему вы должны в этом случае), тогда вам нужно просто преобразовать строку в целое число и использовать целое число для создания команды, которая идет системный файл:

char lvlinput[4]; 
std::cincin.getline(lvlinput, 4); 
char param_str[20]; 
snprintf(param_str, 20, "levelplayer.exe %03d", atoi(lvlinput)); 
system(param_str); 
Смежные вопросы