Как можно вызвать другую функцию fille в элементах массива в C?
• Я изо всех сил пытаюсь понять программу, которая читает набор текстовых строк и печатает самые длинные • Согласно 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)
Вопросы:
Как можно заполнить элементы массива 'array1' значениями, если функция, в которой все это происходит, то есть функция, может возвращать только целое число?
Почему выходная строка добавляется с помощью "vL±~ó°~£Cnr<€ v @ v @ ¶ ~ \ áv ="?
Что означает это обозначение: "0x7efff574 "\304\365\377~\300\365\377~", если бы вы могли указать мне где-нибудь в документах?
1 ответ
Функция не может возвращать массив - она может возвращать только скаляр, или структуру, или объединение, или вообще никакого значения.
Но помимо возвращаемого значения у него могут быть побочные эффекты. Здесь, в качестве побочного эффекта, он изменяет содержимое массива, первый элемент которого указан
s
,function
неправильно завершает строку нулем, следовательно, используя ее сprintf
приводит к неопределенному поведению. Как исправить, добавитьs[i] = 0;
как раз перед
return i;
Обозначением является адрес значения указателя
0x7efff574
в шестнадцатеричном формате, за которым следует содержимое строки с нулевым символом в конце по этому адресу, используя\ooo
восьмеричные побеги для непечатных символов. В этом случае массив содержит некоторый случайный мусор при входе в функцию.
PS Пожалуйста, сделайте отступ в своем коде правильно и последовательно. Оставьте пробел и испортите код.