Как уже говорили другие, ваша проблема не в том, чтобы выделить достаточно места для dest
. Есть еще одна, более тонкая проблема с вашим кодом.
Чтобы преобразовать в верхний регистр, вы проверяете заданное значение char
, чтобы увидеть, находится ли оно между 71 и 123, и если это так, вы хорируете значение с 32. Это предполагает кодирование символов ASCII. ASCII - наиболее широко используемая кодировка, но не единственная.
Лучше написать код, который работает для каждого типа кодировки. Если бы мы были уверены, что 'a'
, 'b'
, ..., 'z'
и 'A'
, 'B'
, ..., 'Z'
, смежны, то мы могли бы вычислить смещение из нижнего регистра буквы в верхнем регистре и используйте это, чтобы изменить регистр:
/* WARNING: WRONG CODE */
if (c >= 'a' && c <= 'z') c = c + 'A' - 'a';
Но, к сожалению, нет такой гарантии, предоставляемой стандартом C. Фактически кодировка EBCDIC является примером.
Итак, для преобразования в верхний регистр вы можете сделать это простым способом:
#include <ctype.h>
int d = toupper(c);
или сверните свои собственные:
/* Untested, modifies it in-place */
char *to_upper(char *src)
{
static const char *lower = "abcdefghijklmnopqrstuvwxyz";
static const char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static size_t n = strlen(lower);
size_t i;
size_t m = strlen(src);
for (i=0; i < m; ++i) {
char *tmp;
while ((tmp = strchr(lower, src[i])) != NULL) {
src[i] = upper[tmp-lower];
}
}
}
Преимущество toupper()
состоит в том, что он проверяет текущую локаль для преобразования символов в верхний регистр. Например, это может быть от æ до,, что обычно является правильным решением. Примечание : Я использую только символы английского и хинди, так что я могу ошибаться в своем конкретном примере!