Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
AraAraAra
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 15
1

Каждую вводимую строчку запихнуть в массив строк

15.10.2017, 15:45. Просмотров 708. Ответов 14
Метки нет (Все метки)

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


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
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include <Windows.h>
#pragma warning(disable : 4996)
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char NewLine = '\n';
 
    char oldstring[80], newstring[80], vedro[80], mass[80][80]; // инициализация строк
    *newstring = 0;
    char *first;
    char c;
    char pr[] = " "; // разделитель пробел
    int i = 0, k = 0;
    int l;//количество строк
        puts("Введите количество строк");
    l = getchar();
 
                puts("Введите строку: ");
 
                while ((c = getchar()) != '\n') // ввод строки
                {
                    oldstring[i] = c;
                    i++;
                }
                oldstring[i] = '\0';
                first = strtok(oldstring, pr);//слово которое получается по пробелу
 
 
                while (first != NULL)
                {
                    strcpy(mass[k], first);
                    k++;
                    first = strtok(NULL, pr); // переход к следующему слову
                }
                for (int g = 0; g < k; g++)
                {
                    strcat(newstring, mass[g]);
                    strcat(newstring, " ");
                }
        
            
        
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2017, 15:45
Ответы с готовыми решениями:

Объясните каждую строчку
#include &lt;stdio.h&gt; #define n 7 int main() { double a; for (int i = 0; i &lt; n; i++) for...

Как расшифровать txt и каждую строчку внести в массив
Всем доброго времени суток! У меня такая проблема (сижу над ней уже целых 2 дня): Есть...

прокомментируйте каждую строчку программы, у самой не получается (максимальный массив)
#include &lt;iostream&gt; using namespace std; void main() { int A,i,j,max; for(i=0;i&lt;3;i++)...

Как запихнуть массив строк в класс?
Есть класс, один из методов который использует массив строк: char* pszName = { &quot;Anton&quot;, &quot;Alex&quot;...

Прокомментируйте мне каждую строчку программы. Структура, сортировка, массив, вывод
//Библиотеки #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &quot;iostream&quot; #include &lt;string.h&gt;...

14
stake-k26
618 / 432 / 332
Регистрация: 25.04.2016
Сообщений: 1,218
15.10.2017, 16:26 2
если число строк заранее известно, т.е. мы сначала вводим число строк, то:
1. получаем число строк n
2. если n > 0 объявляем массив строк размера n,
3. считываем строки и заносим в массив, вроде такого:

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
#include <stdio.h>
 
int main (void)
{
    int n;                      //число строк
    int i = 0;                  //счетчик массива
 
    // получаем число строк
    printf("Numbers of strings?: ");
    scanf("%i", &n);
 
    // если число строк больше 0
    if (n > 0)
    {
        char s[n][80];          //объявляем массив строк
        while (i < n)
        {
            // считываем строки с клавиатуры
            scanf("%s", &s[i]);
            i += 1;
        }
 
        // выводим строки на экран
        for(i=0; i<n; i++)
            printf("%s\n", s[i]);
    }
    return 0;
}
Ну и кроме всего прочего, у вас код c++
0
AraAraAra
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 15
15.10.2017, 17:27  [ТС] 3
Ругается , что выражение должно иметь константное значение , строчка 15
0
COKPOWEHEU
1255 / 901 / 209
Регистрация: 09.09.2017
Сообщений: 3,819
16.10.2017, 10:43 4
man malloc
C
1
2
3
4
char (*str)[80];
str = (char(*)[80])malloc(sizeof(char)*80*n);
...
free(str);
0
AraAraAra
0 / 0 / 0
Регистрация: 14.04.2017
Сообщений: 15
16.10.2017, 21:58  [ТС] 5
Можно подробнее? как это применить к коду? потому что не получается
0
COKPOWEHEU
1255 / 901 / 209
Регистрация: 09.09.2017
Сообщений: 3,819
17.10.2017, 08:49 6
Что не получается? Коды ошибок, непрошедшие тесты в студию.
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
17.10.2017, 14:03 7
AraAraAra,
Цитата Сообщение от AraAraAra Посмотреть сообщение
Вобщем говоря нужно каждую вводимую строчку запихнуть в массив строк с введенным с консоли числом строк
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 20
int main()
{
    int n;
    printf("Count of strings: ");
    scanf( "%d", &n );
    while( getchar() != '\n'); // в потоке остался символ перевода строки
    char **ptr_str = (char**)calloc( n, sizeof(char*) );
 
    for( int i = 0; i < n; i++ )
    {
 
        char buff[LEN+1];
        gets( buff );
        ptr_str[i] = (char*)calloc( LEN+1, sizeof(char) );
        strcpy( ptr_str[i], buff );
    }
    for( int i = 0; i < n; i++ )
        printf( "%-s ", ptr_str[i] );
    for( int i = 0; i < n; i++ )
        free( ptr_str[i] );
    free( ptr_str );
    return 0;
}
0
karmmarin
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 11
17.10.2017, 14:17 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что не получается? Коды ошибок, непрошедшие тесты в студию.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string.h>
#define COL_NUM 800
 
int main()
 
{
    char **strings;//массив из указателей на слова
    unsigned i;
    unsigned count = 0;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    const int maxNumber = 100;
    char oldstring[80];
    char*first;
    char c;
    unsigned size;
    char pr[] = " ";//разделитель пробел
 
    
        printf("Введите число строк 0 to %d: ", maxNumber);//ввод числа строк до максимального числа
        scanf("%d", &size);
                
    strings = (char**)malloc(size * sizeof(char*));//выделяем память под массив из size указателей
    printf("Введите строки ");
    do
    {
        printf("%d: ", count);
 
 
        int z = 0, k = 0;
        while ((c = getchar()) != '\n') // ввод строки
        {
            oldstring[z] = c;
            z++;
        }
        oldstring[z] = '\0';
 
        first = strtok(oldstring, pr);//получаем слово разделителем пробел
 
        strings[count] = (char*)malloc(sizeof(char) * 80);//выделяем память под строку
 
        while (first != NULL)//пока слова в строке не кончатся
        {
            strcpy(strings[k], first);//копируем слова в новую строку-массив
            k++;
            first = strtok(NULL, pr);
        }
        count++;//переходим на след строку
 
    } while (count<size);
 
    for (i = 0; i < count; i++)//вывод строк
    {
        printf("%s\n", strings[i]);
    }
    _getch();
    for (i = 0; i < count; i++)
    {
        free(strings[i]);
    }
    free(strings);
 
}
Вот в этом проблема. Вводится массив не с 0 элемента, а с первого. Он как будто проускает его. И после массива выводится непонятная вещь вот эта.
0
Миниатюры
Каждую вводимую строчку запихнуть в массив строк  
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
17.10.2017, 14:25 9
karmmarin,
Цитата Сообщение от Michail97 Посмотреть сообщение
while( getchar() != '\n'); // в потоке остался символ перевода строки
ставь после каждого scanfa
0
karmmarin
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 11
17.10.2017, 14:34 10
Добавлено через 2 минуты
Спасибо , но получается, что это не строка, а просто массив символов, должна быть именно по словам пробелом разделена, и введены символы с помощью gectchar(), не все так просто

Добавлено через 4 минуты
Цитата Сообщение от Michail97 Посмотреть сообщение
ставь после каждого scanfa
А как быть с тем что не с 0 элемента начинается ввод? посмотри пожалуйста.
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
17.10.2017, 14:35 11
karmmarin, ну смотри, вводишь в поток, getchar считывает по символу, видишь пробел( любой разделитель ) - переходишь на новый массив.
0
karmmarin
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 11
17.10.2017, 14:39 12
Цитата Сообщение от Michail97 Посмотреть сообщение
karmmarin, ну смотри, вводишь в поток, getchar считывает по символу, видишь пробел( любой разделитель ) - переходишь на новый массив.
Спасибо, уже лучше! теперь с 0 элемента печатает. Но после ввода всех строк , внизу все также символы появляются.
0
Michail97
93 / 40 / 23
Регистрация: 18.09.2016
Сообщений: 372
17.10.2017, 15:32 13
karmmarin,
Цитата Сообщение от karmmarin Посмотреть сообщение
должна быть именно по словам пробелом разделена, и введены символы с помощью gectchar(), не все так просто
не знаю как ты хочешь сразу узнать сколько там слов будет, если бы это был массив, было бы просто, а с getcharom дажу не знаю
В общем, смотри. Если что полезное, присмотри. Память я не возвращал, так что возврати сам.
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>
#include <stdlib.h>
#include <string.h>
#define LEN 20
int main()
{
 
    printf( "Enter sentence\n" );
    char al;
    char **mass = NULL;
    char buff[31];
    int i = 0, k = 0;
    while(  ( al = getchar()) )
    {
       buff[i] = al;
       if(  buff[i] == ' ' ||  buff[i] == ',' || buff[i] == '\n')
       {
         buff[i] = '\0';
         mass = (char**)realloc( mass, sizeof(char*)*(k+1) );
         if( !mass ) return 1;
         mass[k] = (char*)calloc( LEN+1, sizeof(char));
         if( !mass[k] ) return 1;
         strcpy( mass[k], buff );
         k += 1;
         if( al == '\n' )break;
         i = 0;
       }
        else
            i++;
    }
 
    for( int i = 0; i < k; i++ )
      puts( mass[i] );
 
    return 0;
}
0
karmmarin
0 / 0 / 0
Регистрация: 17.10.2017
Сообщений: 11
18.10.2017, 23:38 14
Цитата Сообщение от Michail97 Посмотреть сообщение
не знаю как ты хочешь сразу узнать сколько там слов будет, если бы это был массив, было бы просто, а с getcharom дажу не знаю
В общем, смотри. Если что полезное, присмотри. Память я не возвращал, так что возврати сам.
Спасибо большое!

Добавлено через 15 секунд
Цитата Сообщение от Michail97 Посмотреть сообщение
не знаю как ты хочешь сразу узнать сколько там слов будет, если бы это был массив, было бы просто, а с getcharom дажу не знаю
В общем, смотри. Если что полезное, присмотри. Память я не возвращал, так что возврати сам.
Спасибо большое!
0
stake-k26
618 / 432 / 332
Регистрация: 25.04.2016
Сообщений: 1,218
19.10.2017, 22:21 15
Посимвольный ввод строки getchar'ом:

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
46
47
#include <stdio.h>      //предоставляет: fgetc, stdin
#include <stdlib.h>     //sizeof, free, realloc, malloc
#include <string.h>     //strcmp, strncpy
 
char* getstring (void)
{
    char* buffer = NULL;                        //буфер для хранения символов
    unsigned int capacity = 0;              //размер буфера
    unsigned int n = 0;                     //сколько символов в буфере
    int bitofchar = sizeof(char);           //сколько бит в одном char
    int MAX_LEN = 2048;                     //1 строка максимум 4 Мб (MAX_LEN*2)
    int c;                                      //сюда записываем символы
 
    // получаем символы
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        if (n + 1 > capacity)               //проверяем размер буфера
        {
            if (!capacity) capacity = 32; //по умолчанию 32 символа
            else if (capacity <= MAX_LEN) capacity *= 2;
            else                                    //угроза переполнения буфера
            {
                free(buffer);
                return NULL;
            }
            // меняем размер буфера в памяти
            char* temp = (char*) realloc(buffer, capacity * bitofchar);
            if (!temp)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }
        // заносим символ в буфер
        buffer[n++] = c;
    }
    if (n == 0 && c == EOF) return NULL;//если пустая строка, вернем NULL
 
    // минимизируем размер буфера
    char* minimal = (char*) malloc((n + 1) * bitofchar);
    strncpy(minimal, buffer, n);
    free(buffer);                               //освобождаем память
    minimal[n] = '\0';                      //добавляем конец строки
 
    return minimal;                         //возвращаем получившуюся строку
}
0
19.10.2017, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2017, 22:21

Имеется текстовый файл, содержащий 20 строк. Переписать каждую из его строк в массив в том же порядке
имеется текстовый файл, содержащий 20 строк. Переписать каждую из его строк в массив в том же...

Переписать каждую из строк файла в массив в том же порядке
Имеется текстовый файл, содержащий 20 строк. Переписать каждую из его строк в массив в том же...

Объясните каждую строчку!
Объясните что делается на каждой строке. ( например frm.show(); - показывает скрытую форму и т.д)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru