Как вернуть массив символов на основе символа, переданного в функцию? - PullRequest
0 голосов
/ 01 апреля 2019
char * findCombination(char * c)
{
    switch(c)
    {
    case "2":
        char c[] = {'a', 'b', 'c','\0'};
        return c;
        break;
    case "3":
        char c[] = {'d', 'e', 'f', '\0'};
        return c;
        break;
    case "4":
        char c[] = {'g', 'h', 'i', '\0'};
        return c;
        break;
    case "5":
        char c[] = {'j', 'k', 'l', '\0'};
        return c;
    case "6":
        char c[] = {'m', 'n', 'o', '\0'};
        return c;
        break;
    case "7":
        char c[] = {'p', 'q', 'r', 's', '\0'};
        return c;
        break;
    case "8":
        char c[] = {'t', 'u', 'v', '\0'};
        return c;
        break;
    case "9":
        char c[] = {'w', 'x', 'y', 'z', '\0'};
        return c;
        break;
    default:
        break;

    }
}
int main()
{
    char number[2];
    scanf("%s",&number);
    char array[] = findCombination(number);
    return 0;
}

Здесь я хочу, чтобы функция возвращала массив символов всякий раз, когда я передаю строку.Как я могу вернуть массив символов из функции?Например, если input char равен 2, функция вернет массив символов {'a', 'b', 'c', '\ 0'}

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Прежде всего, вы не можете использовать switch в строке - аргумент должен быть целым.Вы можете включить отдельные символы следующим образом:

switch( c[0] ) // or switch ( *c )
{
  case '2': // note single quote instead of double quote
    ...
  case '3': 
    ... 

Вы не можете вернуть массив из функции, а также не можете инициализировать массив с помощью вызова функции.Честно говоря, ваш лучший вариант - передать целевой массив в качестве аргумента:

void findCombination( int number, char *combo, size_t combo_size )
{
  switch( number )
  {
    case 2:
      strcpy( combo, "abc" );
      break;

    case 3:
      strcpy( combo, "def" );
      break;
    ...
  }
}

int main( void )
{
  int number;
  char combo[5];

  scanf( "%d", &number );
  getCombo( number, combo, sizeof combo );
  ...
}
0 голосов
/ 01 апреля 2019

Ряд проблем с предоставленным вами кодом.

  1. Кажется, вам не хватает понимания переменных 'где'.

В функции findCombination () все переменные char c [] находятся в стеке. Таким образом, их время жизни является только временным в том смысле, что как только функция вернется, вы должны предположить, что то, что когда-либо было установлено, будет мусором вне функции.

Когда вы вернете c, вы будете возвращать указатель на память, которая действительно больше не существует и должна рассматриваться как случайная память.

  1. функция findCombination () не возвращает все пути управления. Если вы этого еще не сделали, включите максимальное количество предупреждений при компиляции и исправьте все предупреждения перед запуском. Компилятор должен жаловаться, что функция не возвращает значение.

Два способа исправить эту функцию и решить проблему 1 - это ...

A. Используйте динамическую память для возврата массива c.

char *cbuffer = (char *) malloc(sizeOfArrayHere);
memcpy(cbuffer, c, sizeOfArrayHere);
return cbuffer;

Однако в какой-то момент вам потребуется освободить () этот буфер, иначе вы «утечете» эту память.

B. Предоставьте достаточно большой буфер для функции, чтобы заполнить ее.

void findCombination(char *c, char *cbuffer)
{
   /* validating input if needed. */
   if (cbuffer == NULL)
   {
      return;
   }
   ...
   /* assuming you have passed in a larger enough buffer. */
   memcpy(cbuffer, c, sizeOfArrayHere);
   ...
}
0 голосов
/ 01 апреля 2019

Проблема в том, что вы создаете локальный массив, а затем возвращаете указатель на него.Массив затем выходит из области видимости.Когда вы затем пытаетесь получить доступ к этому массиву вне области действия, вы вызываете неопределенное поведение .

Это также недопустимо:

char array[] = findCombination(number);

Поскольку массив должен быть инициализирован сконстантное выражение.

Вы также не можете передать char * в качестве условия switch, поскольку оно смотрит только на числовое значение.

Предполагая, что вы не хотитечтобы изменить массив, который вы передаете обратно, и учитывая, что возвращаемые массивы на самом деле являются строками, вы можете вернуть строковые константы из функции.Строковые константы имеют время жизни полной программы, поэтому их можно безопасно возвращать.Затем вы должны присвоить возвращаемое значение указателю.

Вам также следует изменить функцию, чтобы она принимала один char и проверял это.

const char * findCombination(char c)
{
    switch(c)
    {
    case '2':
        return "abc";
    case '3':
        return "def";
    case '4':
        return "ghi";
    case '5':
        return "jkl";
    case '6':
        return "mno";
    case '7':
        return "pqrs";
    case '8':
        return "tuv";
    case '9':
        return "wxyz";
    default:   // you need to return something in the default case as well.
        return "";
    }
}

int main()
{
    char number;
    scanf(" %c",&number);
    const char *array = findCombination(number);
    printf("returned %s\n", array);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...