2 / 1 / 1
Регистрация: 05.10.2016
Сообщений: 9
1

Скопировать одномерный символьный массив в двумерный символьный массив

05.10.2016, 17:45. Показов 1522. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, учусь программировать на Си. Столкнулся с проблемой: не могу скопировать одномерный символьный массив в двумерный символьный массив. Вот программа из книги Карнигана и Ритчи по Си (здесь копирование одномерного символьного массива в другой одномерный символьный):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#define MAXLINE 1000 /*max size of entering string*/
 
//функция с названием getline уже есть в std, напишем getlinee
int getlinee(char line[], int maxline); //т.к. по умолчанию функции int, то тип можно было не писать
void copy(char to[], char from[]);
 
//print the longest string
main(){
    int len; //length of current string
    int max; //length of max string of watch
    char line[MAXLINE]; // current string
    char longest[MAXLINE]; //the longest string
    max = 0;
    while ((len = getlinee(line, MAXLINE)) > 0)
        if (len > max){
            max = len;
            copy(longest, line);
        }
    if(max>0) //была ли получена строка?
        printf("%s", longest); //idenrifer %s means that this is string
    return 0;
}
 
//reading string into s, after that return length_error
int getlinee(char s[], int lim){
    int c, i;
    for (i=0; i<lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) //здесь вводим новую строку своего сообщения
        s[i] = c;
    if(c == '/n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}
 
//copies from 'from' to 'to'.   to - quite(довольно) large
void copy(char to[], char from[]){ //void можно не писать, т.к. это было уже сделано при описании
    int i;
    i = 0;
    while((to[i] = from[i]) != '\0')
        ++i;
    return;
}
Вот то, что я написал (копирование одномерного в двумерный):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#define MAXLINE 1000 /*max size of entering string*/
 
//функция с названием getline уже есть в std, напишем getlinee
int getlinee(char line[], int maxline); //т.к. по умолчанию функции int, то тип можно было не писать
void copy(char to[][], char from[]);
 
//print the all line longer 80 symbols
main(){
    int len; //length of current string
    char j = 0;
    int i = 0; //length of max string of watch
    char line[MAXLINE]; // current string
    char stroki[10][MAXLINE];
    while ((len = getlinee(line, MAXLINE)) > 0)
        if (len > 80){
            copy(stroki[j][], line);
            ++j;
        }
    if(j>0) //была ли получена хоть 1 строка больше 80?
        printf("%s", stroki[0]); //identifier %s means that this is string
    return 0;
}
 
//reading string into s, after that return length_error
int getlinee(char s[], int lim){
    int c, i;
    for (i=0; i<lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) //здесь вводим новую строку своего сообщения
        s[i] = c;
    if(c == '\n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}
 
//copies from 'from' to 'to'.   to - quite(довольно) large
void copy(char to[][], char from[]){ //void можно не писать, т.к. это было уже сделано при описании
    int i;
    i = 0;
    while((to[][i] = from[i]) != '\0')
        ++i;
    return;
}
Много что перепробовал, но все равно компилятор сообщает об ошибках. Что исправить, чтобы работало?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2016, 17:45
Ответы с готовыми решениями:

Объявить массив rs из 5 строк как двумерный символьный массив
Объявить массив rs из 5 строк как двумерный символьный массив. Инициализировать rs значениями “un”,...

Двумерный Символьный массив на языке Си
В общем столкнулся я при изучении языка Си с некой проблемой в задаче: Пользователь вводит...

Прочитать из файла символьный двумерный массив, и отсортировать те строки, в которых имеется символ "/"
Снова вопрос по сортировке (просто сейчас их разбираю). Задание такое, прочитать из файла...

Чем отличаются двумерный символьный массив и массив указателей на строки
Двумерный символьный массив и массив указателей на строки. Собственно чем они отличаются? Заранее...

6
Диссидент
Эксперт C
27709 / 17325 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
05.10.2016, 22:04 2
Цитата Сообщение от P0lin0m Посмотреть сообщение
компилятор сообщает об ошибках.
У мен оттранслировалось и собралось без проблем. А что говорит твой компилятор?
0
2 / 1 / 1
Регистрация: 05.10.2016
Сообщений: 9
06.10.2016, 15:30  [ТС] 3
Я пишу программы через среду CodeBlocks и компилятор GNU GCC Compiler, он выдает 5 ошибок и 3 предупреждения:
Миниатюры
Скопировать одномерный символьный массив в двумерный символьный массив  
0
Диссидент
Эксперт C
27709 / 17325 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.10.2016, 15:45 4
P0lin0m, Хорошо бы привести список ошибок обычным текстом. В виде картинки его сложновато смотреть.
Строчку 6 напиши так
C
1
void copy(char to[10][], char from[]);
Соответствено и строчку 40 подправь
Цитата Сообщение от P0lin0m Посмотреть сообщение
//void можно не писать, т.к. это было уже сделано при описании
Эти соображения ошибочны

Добавлено через 5 минут
Прошу прощения. Наоборот.
C
1
void copy(char to[][MAXLINE], char from[]);
Сам подумай, как транслятор будет обращаться с элементами такого [][] массива?
Строчка 17
C
1
copy(stroki, line);
Ты же массив передаешь, а не элемент. Да еще неизвестно какой!
0
2 / 1 / 1
Регистрация: 05.10.2016
Сообщений: 9
06.10.2016, 22:44  [ТС] 5
Вот все ошибки (еще раз, в виде текста):
Кликните здесь для просмотра всего текста
|6|error: array type has incomplete element type|
|9|warning: return type defaults to 'int' [-Wreturn-type]|

||In function 'main':|
|17|warning: array subscript has type 'char' [-Wchar-subscripts]|
|17|error: expected expression before ']' token|
|17|error: type of formal parameter 1 is incomplete|
|12|warning: unused variable 'i' [-Wunused-variable]|
|39|error: array type has incomplete element type|

||In function 'copy':|
|42|error: expected expression before ']' token|


Следуя вашим советам, исправил строку 6 на
C
1
void copy(char to[][MAXLINE], char from[]);
и стоку 39 на
C
1
void copy(char to[][MAXLINE], char from[]){
также исправил строку 17 на
C
1
copy(stroki[j][MAXLINE], line);
вот, что получилось:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int getlinee(char line[], int maxline); 
void copy(char to[][MAXLINE], char from[]);
 
//print the all line longer 80 symbols
main(){
    int len; //length of current string
    int j = 0; //the number line longer than 80 characters
    char line[MAXLINE]; // current string
    char stroki[10][MAXLINE];
    while ((len = getlinee(line, MAXLINE)) > 0)
        if (len > 80){
            copy(stroki[10], line);
            ++j;
        }
    if(j>0) //была ли получена хоть 1 строка больше 80?
        printf("%s", stroki[0]); 
    return 0;
}
 
int getlinee(char s[], int lim){
    int c, i;
    for (i=0; i<lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) 
        s[i] = c;
    if(c == 'n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}
 
void copy(char to[][MAXLINE], char from[]){ 
    int i ;
    i = 0;
    while((to[][i] = from[i]) != '\0')
        ++i;
    printf("%s", to);
    return;
}


теперь компилятор выдает ошибку в строке 35:
expected expression before ']' token
т.е. он хочет, чтобы я указал строку, но ведь значение строки я передаю из ф. main, а именно переменная j

несколько вопросов:
*почему нельзя не писать в квадратных скобках в строке 32 значения? они же по идее передаются из аргументов ф. main и подставляются в параметры ф. copy (строка 32)

*можно ли отдельно передать строку из двумерного массива (т.е. одномерный массив, вытащенный из двумерного)? именно это я пытаюсь сделать в этой программе - скопировать посимвольно строку из одномерного массива в двумерный
0
738 / 543 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
07.10.2016, 02:59 6
P0lin0m, совет бесплатный-забейте на Кернигана, учебник С.Прата,например, в 100500 раз лучше
0
2 / 1 / 1
Регистрация: 05.10.2016
Сообщений: 9
07.10.2016, 19:59  [ТС] 7
В общем, после раздумий, решил сделать не через отдельную ф., а прямо в ф. main. Все работает, вот код, если кому понадобится
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#define MAXLINE 1000 /*max size of entering string*/
 
int getlinee(char line[], int maxline);
 
//print the all line longer 80 symbols
main(){
    int len; //length of current string
    int j = 0, i; //the number line longer than 80 characters
    char line[MAXLINE]; // current string
    char stroki[MAXLINE][MAXLINE];
    while ((len = getlinee(line, MAXLINE)) > 0)
        if (len > 80){
            i = 0;
            while( (stroki[j][i] = line[i]) != '\0')
                ++i;
            ++j;
        }
    for (i=0; i < j; ++i)
        printf("%s\n", stroki[i]);
        system("pause");
    return 0;
}
 
//reading string into s, after that return length_error
int getlinee(char s[], int lim){
    int c, i;
    for (i=0; i<lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) //Here we introduce a new line of its text
        s[i] = c;
    if(c == 'n'){
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}


Но передо мной стоит задача реализовать код с 14 по 17 строку через отдельную функцию. Если Вы знаете, как это сделать, пожалуйста дайте знать.
К тому же здесь есть ограничение на количество строк, которые можно записать в массив, а мне нужно, чтобы это количество было не ограничено. Но при этом, если возможно, это нужно сделать без динамической памяти, указателей и ссылок.
0
07.10.2016, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2016, 19:59
Помогаю со студенческими работами здесь

Скопировать один символьный массив в другой
Привет всем, многоуважаемые пользователи не могу сделать программу. Нам даны два массива s1 и s2...

Двумерный символьный массив
Здравствуйте, помогите с задачей, не могу справиться. Вот условие и то, что я написал. Для...

Некорректно отображается символьный двумерный массив
Здравствуйте, возникла такая проблема. Когда инициализирую обычную символьную переменную АСКИ...

Как побайтово скопировать dll в символьный массив и запустить его?
Родился вопрос больше из любопытства. Есть ли возможность побайтово считать dll в массив символов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru