2010-11-01 3 views
0
#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; 
} 

Что случилось с кодом выше?c передать строку для функции, а затем вернуть строку

+4

Обратите внимание на предупреждения компилятора! И если компилятор не дал, либо узнайте, как включить их, либо получить лучший компилятор. –

ответ

2

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

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

EDIT: Кроме того, getStr вызывается до его объявления. Ваш компилятор может разрешить это, но это плохая практика по многим причинам. Вы должны объявить его или определить его до его использования. Если вы используете GCC в качестве компилятора, всегда используйте

gcc -ansi -Wall -pedantic 

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

+0

Это не домашнее задание, я пишу сценарий для обучения c – friends

+0

Приношу свои извинения. Это звучит так же, как вопрос домашней работы. – Kizaru

0

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

Изменение:

new_str = getStr(&abc); 

к:

new_str = getStr(abc); 

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

6

куча мелких вещей:

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

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

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

+0

Пункт 3 на самом деле не соответствует действительности, но в любом случае это хороший стиль. – schot

3

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

#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 (& а) к new_str = getStr (а)
+0

+1 для диагностики printf() - и я удалил свой ответ, который только что указал на это. –

+0

'char * abc =" abc ";' действительно должен быть 'const char'. –

+0

Вы можете сделать 'printf (str);' Это, конечно, плохая идея, но компилятор позволит вам это сделать. – JeremyP

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