функция указателя массива - PullRequest
0 голосов
/ 01 ноября 2011

Я искал решение для этого, но не нашел его.

У меня есть функция, которая выполняет некоторые операции со строками (упрощенно):

void plr(char str, char *stro){
     strcpy(*stro, str);
}

Моя проблема заключается в том, что я не могу получить свой результат из функции:

int main(void){
    //string and string out.
    char str[25], stro[25];
    printf("Something please: ");
    scanf("%s", &str);

    plr(str, &stro); // So basically stro would be the same as str.
    printf("Copy succesfull, %s", stro);
    return 0;
}

Вся идея в том, что у меня есть функция множественного числа, которая добавит множественное число к заданной строке и выведет его в stro Вся манипуляция со строкой была протестирована и работает, если она находится внутри main (), но я просто не могу заставить ее работать с функцией и указателем. Я мог бы оставить все как есть, но чему бы я научился из этого.

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

Редактировать: Спасибо за помощь, она была решена. С благодарностью всем!

Ответы [ 4 ]

2 голосов
/ 01 ноября 2011

Вы должны сделать это:

void plr(char str[], char stro[])
{
     strcpy(stro, str);
}

int main(void)
{
    char str[25], stro[25];
    printf("Something please: ");
    scanf("%s", &str); //unsafe code

    plr(str, stro); 
    printf("Copy succesfull, %s", stro);
    return 0;
}

Пожалуйста, будьте очень осторожны при использовании указателя на массив или строку для большего:

  1. http://pw1.netcom.com/~tjensen/ptr/pointers.htm

Использование scanf для получения строки от пользователя действительно плохо для большего:

  1. Недостатки scanf
0 голосов
/ 01 ноября 2011

Я считаю, что вы должны изменить код на:

void plr(char* str, char *stro)

Если вы хотите передать массив str, вы должны использовать указатель char * str.

ДонНе думаю, что вы можете передавать массивы непосредственно в функции.

, если вы объявите char str [25];компилятор резервирует память для массива, если вы используете char *, он просто будет указывать на первый элемент в массиве.

Надеюсь, это сработает!

Gr,

Дитер

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

Не нужно так путаться с указателями;)

blackbear@blackbear-laptop:~$ cat prova.c
#include <stdio.h>
#include <string.h>

void foo(char *strin, char *strout)
{
    strcpy(strout, strin);
}

int main(void)
{
    char a[100], b[100];

    printf("What's a? ");
    scanf("%s", a);

    printf("What's b? ");
    scanf("%s", b);

    foo(a, b);

    printf("a is \"%s\"\nb is \"%s\"\n", a, b);
}
blackbear@blackbear-laptop:~$ gcc prova.c
blackbear@blackbear-laptop:~$ ./a.out 
What's a? abc
What's b? def
a is "abc"
b is "abc"
blackbear@blackbear-laptop:~$ 

Объяснение:
Это работает, потому что когда вы используете имя массива, оно затухает указатель на его первый элемент.Так что foo(a, b) на самом деле foo(&a[0], &b[0]).Таким образом, даже если a и b являются массивами, передача их в функцию "преобразует" их в указатель.
Цитирование из здесь :

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

и несколько строк ниже:

Распад является неявным &;массив == & массив == & массив [0].В английском языке эти выражения читаются как «массив», «указатель на массив» и «указатель на первый элемент массива» (оператор нижнего индекса [] имеет более высокий приоритет, чем оператор address-of).Но в Си все три выражения означают одно и то же.

Итак, проблема в вашем коде - это просто прототип plr.

Ищите массив с указателем затухания для дополнительной информации об этом явлении.:)

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

Возможно, вам нужен указатель на указатель, то есть объявить вашу функцию void plr(char str, char **stro)

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