2014-01-11 6 views
-1

Это простая функция для многих, но как новичок, мне еще предстоит преодолеть призрак указателя, особенно когда речь идет о строках. Я понимаю некоторые примеры strcmp, strcpy, strlen, а также то, как символы назначаются в памяти с помощью NULL-терминатора. Я также думаю, что переменная указателя в памяти указывает на адрес int var или char и т. Д., И вы назначаете их путем разыменования их в var/char, но всякий раз, когда я пытаюсь написать код, появляется призрачный указатель назад, чтобы укусить меня. Итак, здесь я пытаюсь запустить это и не работает. Буду признателен, если вы могли бы разъяснить это мне ...Передача строк в качестве указателя на функцию

//GETNAME function should return a string that is not NULL and less than 20 characters 

char getname (char *s1) 
{ 
int i, n; 
char s2[i]; 
printf ("Enter your name:"); 
scanf ("%s", "s2"); 

if (s2 == NULL) 
    return 0; 

else if(n<20) 

for (i=0, n =strlen (s2 + 1); i<n; i++) 

*(s1+i) = s2[i]; //copy characters from s2 and point to chars of s1 

return *s1; 
} 

int main (int argc, char *argv[]) 

{  
    char name[20]; 
    char urname; 

    urname = getname(name); 

    printf (" Your name is : %s\n", urname); 

    getch(); 

return NULL; 
} 
+1

Определение «не работает». Мы понятия не имеем, что это должно делать, и мы не можем заставить вас отлаживать код для вас. –

+0

Просьба указать его C. – user2672165

+2

Похоже, вы хотите 'scanf ("% s ", s2);' вместо 'scanf ("% s "," s2 ");' – Lee

ответ

3

Несколько ошибок; может быть больше:

  1. Неинициализированных переменным:

    int i, n; 
    char s2[i]; 
    

    i не инициализирован здесь, пока вы используете его, как если бы это было. Какая ценность должна быть i? Подобным образом это неопределенное поведение.

  2. Некорректное аргумент scanf:

    scanf ("%s", "s2"); 
    

    Второй параметр должен быть указателем на память, что вы хотите вход для записи в, а не константной строки. Оно должно быть:

    scanf ("%s", s2); 
    
  3. Некорректное аргумент strlen:

    for (i=0, n =strlen (s2 + 1); i<n; i++) 
    

    Вы хотите добавить 1 к длине строки не самой строки, поэтому она должна быть

    for (i=0, n = strlen(s2) + 1; i<n; i++) 
    
  4. Общие вопросы с getname, включая тип возврата:

    char getname (char *s1) 
    

    Почему эта функция настолько сложна? Вы можете напрямую указать scanf в параметр s1. Вам ничего не нужно s2. Также неправильный тип возврата. Вы возвращаете указатель, а не один char. Оно должно быть:

    char* getname(char *s1) 
    
  5. Не обработки возвращаемого значения из getname правильно:

    char urname; 
    urname = getname(name); 
    

    getname возвращает указатель на символ, а не один символ. Оно должно быть:

    char* urname; 
    urname = getname(name); 
    
+0

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

0

Как предыдущий пост говорит, что i не инициализирован.

Также линия

scanf("%s", "s2"); 

Должно быть

scanf("%s", s2); 

Линии

if (s2 == NULL) 
    return 0; 

else if(n<20) 

некорректен, так как s2 не будет NULL и n не инициализирован

... То есть для начала

Я рекомендую вам книгу и прочитать ее

+0

Thanx! покупая книгу прямо сейчас ... –

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