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

问题描述 投票:1回答:1

我是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;
}
c arrays switch-statement
1个回答
0
投票

以下建议的代码:

  1. 干净地编译
  2. 检查错误
  3. 要求调用者将返回的指针传递给free()
  4. 避免使用“魔术”数字(如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;
}
© www.soinside.com 2019 - 2024. All rights reserved.