Как можно вызвать другую функцию fille в элементах массива в C? - PullRequest
0 голосов
/ 29 декабря 2018

• Я изо всех сил пытаюсь понять программу, которая читает набор текстовых строк и печатает самые длинные. • Согласно K & R C (1.9), фрагмент:

int my_getline(char line[], int maxline); /* my_getline should return only integer (not string) */
void copy(char to[], char from[]);
int main()
{
    int len; /* current line length */
    int max; /* maximum length seen so far */
    char line[MAXLINE]; /* current input line */
    char longest[MAXLINE]; /* longest line saved here */

    max=0;
    while ((len=my_getline(line,MAXLINE))>0)
        if (len>max) {
            max=len;
            copy(longest,line);
        }
    if (max>0) /* there was a line */
        printf("%s",longest); /* how can array 'longest' got filed with values */
    return 0;
} 

• Следовательно, я создал другую программу, чтобы упростить его.

Вот мой исходный код:

#include <stdio.h>
#define MAX 100
int function(char i[], int);

int main() {
    char array1[MAX];
    function(array1,MAX);
    /* Using printf to print the 1st argument of function, which is array */
    printf("\nThis is THE STRING: %s\n", array1);
}

int function(char s[],int lim) {
    int c,i;
    for (i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)
        s[i]=c;
    return i; /* Does it mean, that the 'function' returns only integer 'i'? */
}

При компиляции программы и выполнении:

pi@host:~/new$ cc -g test.c
pi@host:~/new$ a.out
hello, world

This is THE STRING: hello, worldvL±~ó°~£Cnr<€v@ v@¶~\áv=
pi@host:~/new$

Когда я попытался отладить нато же самое, используя gdb:

(gdb) run
Starting program: /home/pi/new/a.out 
Breakpoint 1, function (s=0x7efff574 "\304\365\377~\300\365\377~", lim=100)
at test.c:14
14      for (i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)
(gdb) n
Hello, world

Breakpoint 3, function (s=0x7efff574 "\304\365\377~\300\365\377~", lim=100)
at test.c:15
15      s[i]=c;
(gdb) p s
$1 = 0x7efff574 "\304\365\377~\300\365\377~"
(gdb) p i
$2 = 0
(gdb) p c
$3 = 72
(gdb)    

Вопросы:

  1. Как элементы массива 'array1' могут быть заполнены значениями, если функция, в которойвсе это происходит, то есть «функция» может возвращать только целое число?

  2. Почему выходная строка добавляется с помощью "vL ± ~ ó ° ~ £ Cnr <€ v@ v @ ¶ ~ \ áv = "? </p>

  3. Что означает это обозначение:" 0x7efff574 "\ 304 \ 365 \ 377 ~ \ 300 \ 365 \ 377 ~", если бы вы моглиуказать мне где-нибудь в документах?

1 Ответ

0 голосов
/ 29 декабря 2018
  1. Функция не может возвращать массив - она ​​может возвращать только скаляр, или структуру, или объединение, или вообще никакого значения.

    Но в дополнение к возвращаемому значению онаможет иметь побочные эффекты.Здесь, в качестве побочного эффекта, он изменяет содержимое массива, на первый элемент которого указывает s.

  2. function неправильно завершает строку нулем, поэтому ее использование с printf приводит к неопределенному поведению.В качестве исправления добавьте

    s[i] = 0;
    

    непосредственно перед return i;

  3. Обозначением является адрес значения указателя 0x7efff574 в шестнадцатеричном формате, за которым следует содержимоестрока с нулевым символом в конце по этому адресу, использующая восьмеричные \ooo для непечатаемых символов.В этом случае массив содержит некоторый случайный мусор при входе в функцию.


PS Пожалуйста, сделайте отступ в своем коде правильно и последовательно.Оставьте пробел и испортите код .

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