Сравнение массива символов C - PullRequest
1 голос
/ 08 мая 2019

Хорошо, поэтому я выполнял задачу кодирования на codewars.com, и задача состояла в том, чтобы взять строку в качестве входных данных и вернуть строку, где вместо букв вместо номера указан алфавит, соответствующий букве.

Все, кроме букв, следует игнорировать.

ex: «aab» вернет «1 1 2»

Между каждым числом, представляющим букву в алфавите, должен быть пробел.

Итак, когда я запускаю этот код в моей IDE (это xcode с использованием c99), все выглядит хорошо, а функция strcmp() говорит, что 2 строки равны.Веб-сайт, на котором я работаю, использует C11, но я не вижу, что это вызывает ошибку.

Когда я запускаю этот код на веб-сайте с запросами, он проходит несколько тестов, но затем не проходит и пару.Он терпит неудачу, когда входная строка "", и он также терпит неудачу в строке, которую я использовал в приведенном ниже коде, но опять же он не перестает работать, когда я запускаю его на моем ide.

Мои вопросы:

1) Любая идея, что является причиной этой ошибки?

2) Что бы вы сделали по-другому в отношении кода

Спасибо

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *alphabet_position(char *text)
{
    int i,letter_position;
    unsigned long int size = strlen(text);

    char *result = malloc(sizeof(int)*size + 1);

    char int_string[10];
    char temp = ' ';

    //If String wasn't blank
    if (strcmp(text, "")!=0)
    {
        for (i=0; i<size-1; i++)
        {
            //If it is a letter
            if (isalpha(text[i]))
            {
                temp = tolower(text[i]);
                if (temp == 'a')
                    strcat(result, "1");
                else
                {
                    letter_position = temp - 'a' + 1;
                    sprintf(int_string,"%d",letter_position);
                    strcat(result, int_string);
                }
                //Print space after letter until the last letter
                if (i!=size-2)
                    strcat(result, " ");
            }
        }
        strcat(result, "\0");
        return result;
    }
    else
    {
        strcat(result, "\0");
        return result;
    }

}


int main(void)
{

    char *string = alphabet_position("The narwhal bacons at midnight.");
    char *expected_output = "20 8 5 14 1 18 23 8 1 12 2 1 3 15 14 19 1 20 13 9 4 14 9 7 8 20";

    printf("Your output %s\n", alphabet_position("The narwhal bacons at midnight."));
    printf("Expt output %s\n", "20 8 5 14 1 18 23 8 1 12 2 1 3 15 14 19 1 20 13 9 4 14 9 7 8 20");

    printf("\n");

    printf("your len %lu\n", strlen(alphabet_position("The narwhal bacons at midnight.")));
    printf("Expt len %lu\n", strlen(expected_output));

    if (strcmp(string, expected_output)==0)
        printf("Equal\n");
    else
        printf("Not equal\n");
    return 0;
}

1 Ответ

4 голосов
/ 08 мая 2019

У вас две серьезные проблемы.

Во-первых, вы не инициализируете содержимое массива result пустой строкой. После того, как вы позвоните malloc(), добавьте:

result[0] = '\0';

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

Во-вторых, цикл for не обрабатывает последний символ text. Должно быть:

for (i = 0; i < size; i++)

Аналогично, тест для добавления пробела должен быть if (i != size-1). Вы думаете, strlen() считает нулевой символ в конце?

Количество места, которое вы указываете в malloc(), неверно, но на практике это не вызовет проблем. sizeof(int) не имеет ничего общего с количеством символов, которое требуется для отображения значения целого числа. Поскольку вы просто печатаете алфавитную позицию, она будет не более 26, поэтому вам нужно 3 символа для каждого входного символа. Поэтому должно быть:

char *result = malloc(3 * size + 1);

Ваше распределение работает, потому что sizeof(int) обычно равно как минимум 4, поэтому вы выделяете более чем достаточно места.

Существуют и другие незначительные проблемы, которые не влияют на правильность результата:

Вам не нужен оператор if, который обрабатывает 'a' специально, код, который вы используете в else, будет работать для всех букв.

Вам не нужно strcat(result, "\0") в конце. result уже должен заканчиваться нулем, чтобы вы могли использовать его в качестве аргумента для strcat(), поэтому нет смысла использовать strcat() для добавления нулевого терминатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...