Назначение предупреждения делает указатель из целого числа без приведения в C - PullRequest
0 голосов
/ 23 марта 2020

Продолжайте получать сообщение об ошибке: назначение [Warning] делает указатель из целого числа без приведения for-l [i] = string [i]; и r [j] = string [j];

Может кто-нибудь объяснить, почему и предложить некоторые изменения, которые позволили бы сделать код без ошибок? (Я только начал изучать C LOL, я привык к java, так что я немного борюсь с использованием строк)

void split_string_at_index(char* string, int index, char* left, char* right) {
    int size = sizeof(string);
    char* r[MAX_SUBSTRING];
    char* l[MAX_SUBSTRING];
    int i,j;

    for(i = 0; i<index; i++){
        l[i] = string[i];
    }

    for(j = index; j<size;j++){
        r[j] = string[j];
    }
}

1 Ответ

1 голос
/ 23 марта 2020

Основной проблемой здесь является необходимый сдвиг в мышлении, так как C и Java - это разные языки, и они достаточно различны здесь, чтобы сбить вас с толку. Помимо предупреждающего сообщения, о котором сообщается в вопросе, имеются дополнительные ошибки.

В некотором смысле в C нет строк. C не имеет строкового типа. Вместо этого у него есть соглашение о том, как обрабатывать буферы / массивы char, чтобы они действовали как строки. В частности, нулевой терминатор используется для обозначения конца «строки» или используемой в данный момент части буфера.

Таким образом, строка стиля C представляет собой массив / буфер, который содержит последовательность символов заканчивается нулевым символом ('\ 0'). Вы несете ответственность за предоставление достаточно большого буфера для размещения всех символов и нулевого терминатора, за то, что вы никогда не пытаетесь вставить в него больше символов, чем поместится, и сохраняете его нулевым. Переменная char * не является строкой или просто как строка, хотя используется при работе со строками в стиле C.

Так что в:

void split_string_at_index(char* string, int index, char* left, char* right) {
    int size = sizeof(string);

ваша "строка" не является строка, это указатель на символ, и его размер не имеет никакого отношения к длине строки, к которой он дает вам доступ. Вы хотите:

int size = strlen(string);

Далее:

char* r[MAX_SUBSTRING];
char* l[MAX_SUBSTRING];

вы пытаетесь настроить массивы char для хранения строк. Указатели не входят в это в этом пункте. Вы хотите:

char r[MAX_SUBSTRING];
char l[MAX_SUBSTRING];

, предполагая, что MAX_SUBSTRING достаточно велик, чтобы включить все символы, которые вы когда-либо попытаетесь вставить в них + 1 для нулевого терминатора. Вы должны включить + 1.

В следующей части пропущен нулевой терминатор, поэтому вы хотите:

int i,j;

for(i = 0; i<index; i++){
    l[i] = string[i];
}
l[index] = '\0';

В следующей части для r отсутствует нулевой терминатор и индексирование отключено.

    for(j = index; j<size;j++){
        r[j - index] = string[j];
    }
    r[size-index] = '\0';
}

Теперь это должно решить проблему со строками, но есть и другие проблемы. Во-первых, два параметра (левый и правый) никогда не используются. Во-вторых, переменные r и l являются локальными для функции и перестают существовать, когда она заканчивается. Это означает, что ваша функция фактически не работает. Я предполагаю, что цель состояла в том, чтобы l и r действительно определялись вызывающими этой функцией (а не внутри нее) и передавались в функцию в качестве левого и правого параметров. Далее, что эти параметры должны были использоваться в функции, где в настоящий момент находятся l и r.

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