Я пытаюсь реализовать функцию, которая получает на вход строку c, преобразует все символы нижнего регистра в верхний регистр, а затем сохраняет результат в выходном параметре. Вот код этой функции:
void makeUpper( const unsigned char* input, unsigned char* output )
{
int inputLength = strlen((char*)input);
int outputLength = strlen((char*)output);
for (int i = 0; i < inputLength; i++)
{
if ((input[i] >= 97) && (input[i] <= 122))
{
output[i] = input[i] - 32;
}
else
{
output[i] = input[i];
}
}
}
Теперь проблема явно возникнет в случае, когда inputLength > outputLength. Чтобы исправить это, я вставил следующий код между объявлениями inputLength и outputLength и циклом for.
if (inputLength > outputLength)
{
for (int i = 0; i < (inputLength - outputLength); i++)
{
strcat((char*)output, " ");
}
}
Это не только вызывает ошибку (эта функция или переменная могут быть небезопасными...), но я почти уверен, что делаю это неправильно. Однако я не могу думать ни о каких альтернативах.
РЕДАКТИРОВАТЬ:
Основная функция, которую я использую, выглядит следующим образом:
int main()
{
unsigned char in[] = "HELLO aaaaaaaaaa 678";
unsigned char out[] = " xxxxxxxxx";
makeUpper( in, out );
cout << in << " -> " << out << endl;
makeUpper( out, in );
cout << out << " -> " << in << endl;
return 0;
}
То, что я функция должна напечатать, это:
HELLO aaaaaaaaaa 678 -> HELLO AAAAAAAAAA 678xxxxxxxxx
HELLO AAAAAAAAAA 678xxxxxxxxx -> HELLO AAAAAAAAAA 678XXXXXXXXX
malloc
буфер самостоятельно? - person Ian McLaird   schedule 30.10.2013strncat()
столь же смертоносен, как иstrcat()
, в первую очередь потому, что вам нужно знать, сколько данных уже хранится в целевой строке, чтобы иметь возможность правильно указать длину, но если вы это знаете, вам едва ли нужно использовать функцию*cat()
в все. - person Jonathan Leffler   schedule 30.10.2013