Случай переключения портит мой массив, который я пытаюсь преобразовать - PullRequest
1 голос
/ 26 октября 2019

Я новичок в 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 Ответ

0 голосов
/ 27 октября 2019

Следующий предложенный код:

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