Этот синтаксис правильный? - PullRequest
1 голос
/ 30 апреля 2019

Последние пару дней я использовал Coderbyte.com для решения некоторых проблем с кодированием на C. Обычно я использую Codeblocks в качестве своей IDE, я заметил, что иногда рабочее решение в IDE Coderbyte выдает ошибку в Codeblocks. Например:

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

void AlphabetSoup(char str[]) {
    int i, j, length;

    length = strlen(str);

    char new_string[length];
    char temp;

    strcpy(new_string, str);

    for (i = 0; i < length; i++) {
        for (j = i + 1; j < length; j++) {
            if (new_string[i] > new_string[j]) {
                temp = new_string[i];
                new_string[i] = new_string[j];
                new_string[j] = temp;
            }
        }
    }

    // code goes here
    printf("%s", new_string);
}

int main(void) {
    AlphabetSoup(gets(stdin));
    return 0;
}

В кодовых блоках в функции main выдается ошибка:

warning: passing argument 1 of 'gets' from incompatible pointer type [enabled by default]

В любом случае, я не понимаю, почему это решение работает на одной IDE, а не на другой. В другой раз какой-то код, который я вставил, сказал, что он будет работать только в C99.

Теперь, когда я запускаю этот код в Codeblocks, он падает, но не на Coderbyte.

Мои вопросы:

1) Существуют ли разные версии C?

2) Правильно ли этот код или лучше использовать char * для параметра функции

Я все еще новичок в C

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

1) Существуют ли разные версии C?

Да, и конкретная причина, по которой валидность этого кода различается в разных стандартах C, заключается в том, что вы используете функцию gets, которая устарела и впоследствии полностью удалена современными стандартами C. Практически нет способа использовать gets в рабочем коде без риска переполнения буфера, поэтому рекомендуется использовать функции, которые проверяют длину буфера. fgets является наиболее распространенным с:

fgets(buffer, BUFFER_SIZE, stdin);

2) Правильно ли этот код или лучше использовать char * для параметра функции

Нет никакой разницы между параметрами функции: char *foo и char foo[], поскольку, когда массив передается в качестве аргумента функции, он распадается на указатель на свой первый элемент. Оба синтаксиса являются приемлемыми.

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

Этот синтаксис неправильный, потому что объявление массива в c / c ++ должно иметь постоянный размер во время компиляции.

length = strlen(str);

char new_string[length];

значение длины нельзя определить во время компиляции. если вы хотите контролировать размер во время выполнения, вам нужно использовать malloc в C или оператор new (C ++).

См. Статический массив и динамический массив в C ++

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