2015-01-21 3 views
1

Я пытаюсь передать две строки функции, которая копирует вторую строку в первую строку. Получить сообщения об ошибкахПередача строки через указатель - несовместимый аргумент

"passing arguement 1/2 of 'CopyStrings'from incompatible pointer type - line 25. 
note: expected 'char*' but argument is of type 'char**' - line 8 

Вот мой код:

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

// a function that gets 2 strings and copies the second one into the first one 


char CopyStrings(char* string1, char* string2) 
{ 
    strcpy(string1, string2); 

    return *string1; 

} 

int main() 
{ 
    char* string1 = (char*)malloc(sizeof(char)*10); 
    char* string2 = (char*)malloc(sizeof(char)*10); 

    strcpy(string1, "ugabuga"); 
    strcpy(string2, "mukaluka"); 


    printf("%s", CopyStrings(string1, string2)); 


    free(string1); 
    free(string2); 
    return 0; 

} 

Любые предложения, что я испортил, и как я пишу указатели правильно?

EDIT - Теперь, когда я изменил

(&string1, &string2) 

в

(string1, string2) 

программа chrashes.

+0

Не отвергни 'malloc' в С. Кроме того, вы, очевидно, просят адрес' полукокса * 'делая' & string1' в вызове функции, которая проходит в '' символ **. – crashmstr

+0

Ах, правда. Можете ли вы объяснить, почему я не должен использовать malloc здесь? –

+0

использование malloc! = Cast malloc. Кастинг malloc не нужен, и он подавляет какое-то предупреждение, но я не совсем уверен. Это обескураживает. – MightyPork

ответ

1

Были некоторые проблемы с кодом Ops:

В следующем коде, большинство проблем комментируются (и фиксированные) Одна вещь, чтобы знать, в C, имя массива деградирует на адрес из массив пытается всегда передавать указатель на массив, а не полный массив. Оператор преобразования %s ожидает, что связанный параметр будет адресом массива символов.

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

// a function that gets 2 strings and copies the second one into the first one 


char* CopyStrings(char* string1, char* string2) 
{ 
    strcpy(string1, string2); 
    return string1; // return pointer to string1 
} 

int main() 
{ 
    char* string1 = malloc(10); // char is always 1 so no need for sizeof(char) 
    char* string2 = malloc(10); 

    strcpy(string1, "ugabuga"); 
    strcpy(string2, "mukaluka"); 

    printf("%s\n", CopyStrings(string1, string2)); 

    free(string1); 
    free(string2); 
    return 0; 
} // end function: main 
+0

Спасибо за помощь, оцените. Но поскольку указатель char равен массиву, имеет смысл выделить для него память - или я ошибаюсь? –

+0

@Yiu ты прав. Является ли это массивом символов или указателем на char, выделение памяти необходимо, но первый случай может быть временем компиляции, а затем выделяется во время выполнения. –

+0

OK, спасибо за разъяснения. –

3

Вы действительно хотите просто

CopyStrings(string1, string2) 

Это char* уже, и вы делаете char** от него с амперсанд.

Другая проблема заключается в функции - она ​​должна быть:

char* CopyStrings(char* string1, char* string2) 
{ 
    strcpy(string1, string2); 
    return string1; 
} 

(если вы хотите, чтобы вернуть первую строку).

+0

Хорошо, спасибо. Это изменилось. Все еще сбой. –

+0

Да, у вас было больше ошибок. см. отредактированный ответ – MightyPork

+0

Где я могу найти отредактированную версию? –

1

Изменить

CopyStrings(&string1, &string2)

в

CopyStrings(string1, string2)

char* string1, здесь string1 является указателем и когда вы передаете адрес, если указатель, который является указателем на указатель, его не то, что вы имеете в виду и формальные аргументы должны быть двойными указателями. Достаточно всего лишь указателя.

Функция CopyStrings() должна вернуть строку char * после выполнения функции strcpy() для вызывающего. Вот модифицированный code.

+0

Хорошо спасибо. Я изменил это, но программа по-прежнему падает. :/ –

+0

@ Yíu Пожалуйста, проверьте мои изменения. –

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