Top.Mail.Ru
Ответы

Помогите исправить код на языке C

12345678910111213141516171819202122232425262728293031
 #include < stdio.h > 
#include < string.h > 
#include < stdlib.h > 
 
void split_substring(char *line){ 
    char *words[3]; 
    int temp,n1=0; 
    for(int i=0;i<sizeof(line);i++){ 
        while(line[i]!=' ' && line[i+1]!='-' && line[i+2]!=' '){ 
            i++; 
        } 
        words[0]=malloc(sizeof(char)*i); 
        memcpy(words[0],line,sizeof(char)*i); 
        temp=i; 
        while(line[i]!=' ' && line[i+1]!='=' && line[i+2]!=' '){ 
            i++; 
        } 
        words[1]=malloc(sizeof(char)*(i-temp)); 
        memcpy(words[1],&line[temp+2],sizeof(char)*(temp-i)); 
 
        words[2]=malloc(sizeof(char)*(1)); 
        memcpy(words[1],&line[sizeof(line)-1],sizeof(char)*(1)); 
    } 
    printf("%s      %s      %s\n", words[0],words[1],words[2]); 
} 
 
int main() { 
    char line[] = "Он не готовит. - He is not cooking. = 0"; 
    split_substring(line); 
    return 0; 
}  

Я хочу переписать одну программу которую я реализовал на пайтоне в C.
не получается разделить строку на подстроки используя разделители в пайтон это.
words=re.split(" - | = ",line) ;
В си нет такой функции. В СИ есть strtok но дело в том что он разделает не по (пробел-тире-пробел), а по пробелу и тире.
words=re.split(" - | = ",line) ; разделяет его на три подстроки в котором могут находиться несколько слов.
А C разделит на отдельные слова или если -= указывать как разделитель то он оставит пробелы к словам. Например "Он не готовит. ", а должен
"Он не готовит."

Но это не самое худшее . Если использовать вложенный strtok то внешний strtok сломается (если нужно разделять массив по /n , а внутри цикла разделять эту строку на подстроки) .

Вообщем придëтся писать отдельную функцию.
Но она не работает. А chat gpt предлагает strtok который не работает как мне нужно.

Дополнен

И я не знаю нужно ли в последнем выделять два байта. (Его нужно преобразовать в числа)

По дате
По Рейтингу
Аватар пользователя
Новичок
1
 for(int i=0;i<sizeof(line);i++) 

Вот это уже писец. Если вы думаете, что sizeof(line) вернет вам длину строки то вы ну ОЧЕНЬ сильно заблуждаетесь! Вам нужна функция strlen, причем ее не следует включать в цикл for, следует использовать в цикле ее результат (потому что для вычисления длины она ПОЛНОСТЬЮ проходит всю строку от начала и до конца).

По хорошему же, всю вашу функцию надо полностью и тотально переделывать. То, что вы пытаетесь сделать, делается совсем не так.

Аватар пользователя
Искусственный Интеллект

"Он не готовит. - He is not cooking. = 0"

Не указан нужный конечный вид строки.