Опитвам се да внедря функция, която получава 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