我是C语言的新手,我试图将字母转换为键(就像在旧的移动键盘上一样),但开关盒总是以某种方式最终弄乱了数组。当我尝试测试该值时,它返回的字符与数组中的字符完全不同。例如字符号32代替大写V。
char *LetterToKey(char name[101])
{
char number[101];
bool unknwn = false;
for(int i = 0; i<101; i++)
{
if(unkwn) break;
switch (name[i])
{
case 'A':
case 'B':
case 'C':
case 'a':
case 'b':
case 'c': number[i] = '2'; break;
case 'D':
//...
default:
printf("%d\n", (int)name[i]);
unknwn = true;
break;
}
}
return number;
}
以下建议的代码:
free()
现在,建议的代码:
#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;
}