Следующий предложенный код:
- без ошибок компилируется
- проверяет наличие ошибок
- требует, чтобы вызывающая сторона передала возвращенный указатель на
free()
- избегает использования «магических» чисел (например, 101)
- правильно завершает массив результирующих символов, чтобы он не содержал мусорные / неинициализированные символы
и теперь предлагаемый код:
#include <ctype.h> // toupper()
#include <stdlib.h> // calloc()
#include <stdio.h> // printf()
#define MAX_BUF_LEN 101
char *LetterToKey( char *name )
{
char *number = calloc( MAX_BUF_LEN+1, sizeof( char ) );
if( !number )
{
return NULL;
}
// implied else, calloc successful
size_t i = 0;
while( i < MAX_BUF_LEN && number[ i ] )
{
switch ( toupper(name[i]))
{
case 'A':
case 'B':
case 'C':
number[i] = '2';
break;
case 'D':
case 'E':
case 'F':
number[i] = '3';
break;
// etc
default:
printf("unexpected char: %c\n", name[i]);
number[ i ] = ' ';
break;
}
}
return number;
}
Конечно, если вызывающий абонент правильно NUL завершил ввод, тогда код можно упростить до:
#include <ctype.h> // toupper()
#include <stdlib.h> // calloc()
#include <stdio.h> // printf()
#include <string.h> // strlen()
char *LetterToKey( char *name )
{
char *number = calloc( strlen( name )+1, sizeof( char ) );
if( !number )
{
return NULL;
}
// implied else, calloc successful
for( size_t i=0; number[ i ]; i++ )
{
switch ( toupper(name[i]))
{
case 'A':
case 'B':
case 'C':
number[i] = '2';
break;
case 'D':
case 'E':
case 'F':
number[i] = '3';
break;
// etc
default:
printf("unexpected char: %c\n", name[i]);
number[ i ] = ' ';
break;
}
}
return number;
}