2015-06-21 4 views
0

У меня возникла проблема с попыткой выяснить, как добавить указатель char c к существующему Struct String. Я хочу иметь возможность принимать входные данные как таковые (учитывая предопределенный Struct со значением «Hello») append(test,"world") Когда я пытаюсь использовать strcat и strcpy, я получаю сообщение об ошибке, потому что структура String не является допустимым типом используется с этой функцией.Добавление двух строк без str-функций

Как добавить без использования функций str?

В настоящее время у меня есть код, который объявляет структуру и задает значение в качестве содержимого содержимого структуры в этом случае. hello Я ввожу свою функцию и проверяю, не являются ли данные, передаваемые человеком, недействительными. Я создаю новый String Struct с именем append и realloc для нового размера предыдущего «материала» плюс значение * c. Должен ли я использовать цикл for для получения содержимого * c в точке [i] в ​​конце добавления?

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

typedef struct strstf { 
    char * stuff; 
    size_t length; 
} String; 

String * append(String * b, const char * c) { 
    String * append; 
    if (c != NULL) { 
     /* creates memory the size of the original string buffer and the added string */ 
     b->stuff realloc(strlen(c) + strlen(b->stuff) + 1); 
     strcpy(append, b->stuff); 
     strcat(append, c); 
     return append; 
    } 
    if (append->stuff == NULL) { 
     free(append); 
     return NULL; 
    } 
    return append; 
} 
+1

Вы должны выбрать разные имена для функции 'append()' и переменной 'append'. –

+0

'append = (String *) realloc (b-> stuff, ...' ->, например 'b-> stuff = realloc (b-> stuff, ...' – BLUEPIXY

+0

: 'if (! (c = NULL)) {'неверно, он присваивает NULL c, поэтому' if 'всегда будет true. Это одна из (многих) причин всегда размещать литерал слева. IE' if (! (NULL = c)) {'Тогда компилятор поднял бы сообщение об ошибке, и вам не нужно было бы тратить на вас ценное время, отлаживая эту проблему. – user3629249

ответ

3

Есть много вещей не так с вашим кодом. Вот что я заметил только право летучей мыши:

  1. Вы использовали имя переменного append внутри функция называется append, которая является плохой формой. Я даже не уверен, что это скомпилируется.
  2. Оператор = использовался, когда == был действительно нужен. Первый - для назначения , и поэтому условие всегда будет истинным.
  3. realloc() был использован на b->stuff, который является char*, но вы передали его String*. Это может технически работать, но это действительно плохая форма.
  4. После того, как вы использовали realloc() на b->stuff, вы все еще использовали указатель b->stuff, хотя realloc() недействителен указатель, который был передан, и возвращает новый.
  5. strcpy и strcat на указатель типа struct strstf, когда они оба требуют char*

Следующий код работает. Вам просто нужно помнить, чтобы освободить как указатель resultиresult->stuff. Это очень простое место для утечки памяти.

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

typedef struct strstf { 
    char *stuff; 
    size_t length; 
} String; 

String *append(String *b, const char *c){ 
    String* result = malloc(sizeof(String)); /* allocate memory for the resulting string */ 

    if (c != NULL && b != NULL && b->stuff != NULL) { /* make sure nothing is NULL */ 
     result->length = strlen(c) + b->length; /* calculate the length of the new string */ 
     result->stuff = malloc(result->length + 1); /* allocate the memory for the char array (plus '\0' char) */ 
     strcpy(result->stuff, b->stuff); /* copy the first to the result */ 
     strcat(result->stuff, c); /* append the second to the first */ 
     return result; /* return the result */ 
    } 
    return NULL; /* something went wrong */ 
} 

int main(int argc, char* argv[]) { 
    String first; 
    String* result; 
    if (argc != 3) { 
     printf("The syntax of the command was incorrect.\n"); 
     return 1; 
    } 

    first.stuff = argv[1]; 
    first.length = strlen(argv[1]); 

    result = append(&first, argv[2]); 

    printf("Result: %s\n", result->stuff); 

    free(result->stuff); /* DON'T FORGET THIS */ 
    free(result); 

    return 0; 
} 
+0

Мне нравится решение, но одно nit. Когда я попал в «String» CamelCase в то, что выглядит чистым C, это похоже на работу в кирпичную стену. Ой! Это так плохо. Предложение, просто используйте 'strstf' вместо этого. Вы можете использовать его как для имени struct_space, так и для typedef, или, в этом случае, вам даже не нужна начальная 'strstf' вообще. Вы можете просто переместить его, чтобы заменить 'String'. Просто домашнее животное разозлится, придирайтесь, назовите его, как хотите, но верхний регистр в C зарезервирован для использования системой ... (у других, очевидно, будут разные мнения ...) Хороший ответ, хотя ': p' –

+0

@ DavidC.Rankin Если бы это была моя программа, я бы наверняка использовал другое имя. Однако я использовал имя 'String', чтобы следовать стилю его исходного кода. Это может быть только фрагмент кода, и ему, возможно, придется сделать какой-то нежелательный рефакторинг, чтобы его изменить. –

+0

Достаточно честный. Мне просто пришлось перезвонить, когда я ударил по этой стене. В великой схеме вещей это не имеет особого значения, но для старых людей мы как бы застряли в наших путях ... Возможно, вы также захотите помочь другим в будущем, указав различия стиля. –

Смежные вопросы