c передать строку в функцию, а затем вернуть строку - PullRequest
0 голосов
/ 01 ноября 2010
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *abc = "abc";
    char *new_str;
    new_str = getStr(&abc);
    printf("%s", abc);
}

char *getStr(char *str)
{
    printf(str);
    return str;
}

Что не так с кодом выше?

Ответы [ 4 ]

6 голосов
/ 01 ноября 2010

куча мелочей:

  1. Вы передаете &abc на getStr(). &abc - это указатель на переменную , которая содержит вашу строку. Он указывает указатель на указатель, и это несовместимо с аргументом char *str getStr ().

  2. Ваш getStr() определяется после его использования. Вам нужно либо переместить его определение до main(), либо добавить прототип до main().

  3. Тип строкового литерала, например "abc", равен const char *. Вы определяете переменную типа char *, что является сомнительным (поскольку это позволит вам изменить строковый литерал, что недопустимо).

3 голосов
/ 01 ноября 2010

вот рабочая версия:

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

char *getStr(char *str);

int main(void)
{
    char *abc = "abc";
    char *new_str;
    new_str = getStr(abc);
 //printf("%s", *abc); don't really need this
}

char *getStr(char *str) {
 printf("%s", str);
 return str;
}

Вот список проблем со старым:

  1. Нет прототипа для вашей функции getStr.
  2. Вы не можете выполнить printf (str), вам нужен "% s" в качестве дополнительного параметра.
  3. Вам нужно изменить: new_str = getStr (& abc) на new_str = getStr (abc)
2 голосов
/ 01 ноября 2010

Строка AC - это указатель на символ, который начинается с последовательности символов, заканчивающихся нулевым байтом.Переменная abc идеально подходит под это определение.

Кроме того, abc имеет тип указатель на символ.Вы передаете адрес abc, то есть getStr будет получать адрес указателя на символ - поэтому единственный аргумент getStr должен иметь указатель типа на указатель на символ.Типы не совпадают.

РЕДАКТИРОВАТЬ: Кроме того, getStr вызывается до того, как он объявлен.Ваш компилятор может разрешить это, но это плохая практика по многим причинам.Вы должны объявить это или определить его, прежде чем он будет использован.Если вы используете gcc в качестве компилятора, всегда используйте

gcc -ansi -Wall -pedantic

. Эти три флага будут соответствовать стандартам ANSI, и они будут либо кричать на вас по поводу вышеуказанных проблем, либо не компилироваться.

0 голосов
/ 01 ноября 2010

Ваша функция getStr принимает символ *, но это не то, что вы передаете - вы передаете адрес указателя, а не фактический указатель.

Изменение:

new_str = getStr(&abc);

до:

new_str = getStr(abc);

и я думаю, что это сработает.

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