Реализация String и, похоже, не может использовать оператор стрелки

#c #pointers #structure

#c #указатели #структура

Вопрос:

Я должен написать модуль для реализации string, и у меня есть приблизительное представление о том, как и с чего начать. Но я продолжаю получать сообщение об ошибке каждый раз, когда пытаюсь использовать оператор стрелки в C.

SET — предполагается выделить память и инициализировать строку с помощью ввода. COPY — копировать копирует одну строку в другую CONCAT — конкатенация PRINT — выводит ее в конце

Поэтому любая помощь будет оценена:

Файл заголовка:

     #ifndef string_h
    #define string_h

    typedef struct {
     int len;
     char *s;
    } string_t;

    typedef string_t *string;

    void set(string *s1, char *s);
    void copy(string *s1, string s2);
    void concat(string *s1, string s2);
    void print(string s1);


    #endif /* string_h */
 

Файл реализации:

     #include "string.h"
    #include <string.h>
    #include <stdlib.h>


    void set(string *s1, char *s) {
      s1 = (string*) malloc (sizeof(string));
 
      if(s == NULL) {
        s1 -> len = 0;
      } else {
        s1 -> len = strlen(s);
        s1 = (string*) malloc (sizeof(s1 -> len));
        s1 -> s = s;
      }

    }

    void copy (string *s1, string s2) {

    }

    void concat(string *s1, string s2) {

    }

    void print(string s1) {

    }
 

Заголовочные файлы кажутся совершенно нормальными, так как они мало что делают. Но компилятор каждый раз выдает ошибку для «s1 -> len». Так что, если кто-нибудь может мне здесь помочь, я был бы признателен, спасибо.

Комментарии:

1. Поскольку set() s1 аргумент ‘s фактически является указателем на указатель на string_t (это то, что вам нужно, так что это хорошо), вам нужно разыменовать его в вашей malloc() строке. Вам нужно установить, на что он указывает , на адрес выделяемой вами памяти, и выделить место для a string_t , а не для string : *s1 = malloc(sizeof(string_t));

2. Я только что сделал, но это все еще не решило эту ошибку «s1 -> len»

3. Разыменование там тоже: (*s1)->len

4. Или используйте local string tmp вместо s1 внутри функции, затем установите *s1 = tmp перед возвратом.

5. Большое спасибо!! Это сработало! и еще один вопрос. Должен ли я также разыменовывать его в операторе if? Я имею в виду, что это было бы что-то вроде этого: (* s1) = malloc (sizeof((* s1) -> len));

Ответ №1:

s1 похоже, это указатель на указатель, а не указатель на тип структуры.

Вы можете просто изменить typedef , чтобы удалить тип указателя, или просто использовать string type (not string * ), поскольку в противном случае он сам уже является указателем.

Комментарии:

1. Да, это то, что я подумал, но я понятия не имею, как исправить / использовать это в моей реализации без изменения файла заголовка..

2. @dean_winchester только что дал подсказку в ответе.

3. Спасибо, я только что это увидел! Но я не знаю, разрешено ли мне даже изменять параметры и файл заголовка, потому что это то, что дал нам профессор. Поэтому мне было интересно, есть ли какой-либо другой способ решить эту проблему без изменения файла заголовка.

4. @dean_winchester: просто используйте string в реализации, А НЕ string* . Нет необходимости вообще изменять файл заголовка.

5. @MarkBenningfield Да, но поскольку процедура объявлена в файле заголовка, мне также придется изменить ее параметры там.