gpt4 book ai didi

c - Switch case 弄乱了我试图转换的数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:47 24 4
gpt4 key购买 nike

我是 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;
}

最佳答案

以下建议的代码:

  1. 干净地编译
  2. 检查错误
  3. 要求调用者将返回的指针传递给free()
  4. 避免使用“魔数(Magic Number)”(如 101)
  5. 正确终止生成的字符数组,使其不包含垃圾/未初始化的字符

现在,建议的代码:

#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;
}

关于c - Switch case 弄乱了我试图转换的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58572023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com