2015-12-29 2 views
0
void add() 
    {  
    char name[50], surname[50], usern[50]; 

    int id, birth, amount; 
    printf("Enter your name, surname and your year of birth:\n"); 
    scanf("%s %s %d", &name, &surname, &birth); 
    printf("Enter your ID, username and your total amount:\n"); 
    scanf("%d %s %d", &id, &usern, &amount); 
    const char *pass1=function(usern); 
    } 

    const char *function (char usern[50]) 
    { 
    char temp; 
    int i=0; 
    int j; 
    j = strlen(usern) - 1; 
    while (i < j) 
    { 
     temp = usern[i]; 
     usern[i] = usern[j]; 
     usern[j] = temp; 
     i++; 
     j--; 
    } 
    return usern; 
    } 

я называю «добавить» с «основной», чтобы распечатать эти вещи, а затем я называю «функция», чтобы вернуть мне usern строку, но что-то идет не так.не могу понять, как вернуть строку из функции в C

я получаю сообщение об ошибке при компиляции:

[Предупреждение] инициализация делает указатель из целого числа без приведения -> Const символ * pass1 = функция (usern);
[Error] конфликтующие типы для «функции» -> Const символ * функции (символ usern [50])

+0

Что происходит не так? Что вы делаете с 'const char * pass1'? Каков ожидаемый результат и какой результат вы получаете? Широкое заявление вроде «что-то пойдет не так», скорее всего, не поможет вам. Более подробная информация о проблеме, с другой стороны, определенно поможет вам решить проблему. :) – SCCC

+0

привет, предупреждения: [Предупреждение] инициализация делает указатель из целого без трансляции -> const char * pass1 = function (usern); и [Ошибка] конфликтующие типы для 'function' -> const char * function (char usern [50]) – sniperalex117

+0

Я хочу вернуть строку «usern» в «pass1», вызвав эту функцию ('function') – sniperalex117

ответ

5

Сообщения об ошибках, которые вы видите, являются результатом не объявления функции functionдо использования. Поэтому компилятор неявно объявляет прототип с int как тип по умолчанию для function. Но фактический тип возврата function конфликтует с неявным типом int. Таким образом, вы получаете эти ошибки.

Обратите внимание, что это неявное правило int больше не действует, поскольку оно было удалено с C99. Это имело место в C89/C90.

Решение должно предоставить прототип для него. Добавьте это вверху исходного файла (или включите его в файл заголовка, если он у вас есть) .:

const char *function (char *); 
+0

Да, я объявил funtion, как вы говорите, и он работает, но без * перед переменной 'const char * function (char usern [50]);' – sniperalex117

+0

@ sniperalex117 'const char * function (char *);' эквивалентно 'const char * function (char usern [50]);' ... Что вам нужно понять, так это то, что 'usern' не является массивом в контексте' function'; вы ** не можете ** передать массив функции 'function'. Вы можете, однако, имитировать передачу массива, передав указатель. – Sebivor

+0

@ sniperalex117 'const char * function (char usern [50]);', 'const char * function (char * usern);' и 'const char * function (char *);' эквивалентны в прототипе функции. Имя параметра необязательно в прототипах. Массив распадается на указатель на свой первый элемент при передаче функции. Таким образом, тот факт, что вы указываете размер в defintion как 'const char * function (char usern [50]) {..}', не имеет значения и будет проигнорирован компилятором. Таким образом, 'usern' на самом деле является указателем на' function'. –

0

Срок службы, для которых возвращение function действует так же, как на времени жизни параметр usern, который передан ему.

Это потому, что не получен глубокий экземпляр массива символов.

При попытке вернуть pass1 из add и использовать его, то поведение программы будет неопределенный так usern то будет из области видимости.

Нормальная вещь здесь, в C, - это malloc новая строка, возвращающая указатель на нее. Не забудьте позвонить в free в какой-то момент.

+1

Фактически аргумент, обозначаемый 'usern', является указателем, а не массивом, и этот указатель указывает на объект, объявленный в' add'. Вы можете подтвердить это, проверив 'sizeof usern'. – Sebivor

+1

Кроме того, это не совсем нормально для 'malloc' новой * строки *. Для начала строки - это не типы объектов, а вместо них типы значений, а 'malloc' выделяет объекты, а не значения. Что еще более важно, рассмотрите каждую стандартную библиотечную функцию в C: Есть ли 'fgets', например,' malloc' что-нибудь? Нет, но он создает строку, не так ли? – Sebivor

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