Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2012, 12:13   #1
Chuckle
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 12
По умолчанию Создать массив из N строк, введенных с клавиатуры

Добрый день!

Подскажите пожалуйста, как создать массив из N строк, введенных с клавиатуры? (язык си, не си++)

Насколько я понимаю, нужно создать массив из N указателей на char. Т.е.
Код:
char *array[N]
Но как потом организовать ввод N строк с клавиатуры, так чтобы введенную строку "загонять" в массив?

Вот так не получается:
Код:
char *array[N];

for (i = 0; i < N; ++i)
    scanf("%s", &array[i]);
Помогите пожалуйста, никак не могу разобраться...
Chuckle вне форума Ответить с цитированием
Старый 11.11.2012, 13:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нужен массив массивов
Код:
char **array=malloc(n);
Далее в цикле
Код:
array[i]=malloc(255);scanf(...,array[i])
учитывая что строка будет содержать не более 255 символов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2012, 13:47   #3
Chuckle
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 12
По умолчанию

Stilet
Спасибо большое!

А вы не подскажете, как точно обосновать, почему не нужно ставить амперсанд в scanf("%s", array[i])?

Последний раз редактировалось Chuckle; 11.11.2012 в 13:49.
Chuckle вне форума Ответить с цитированием
Старый 11.11.2012, 14:24   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

потому что array[i] уже указатель, не?
p51x вне форума Ответить с цитированием
Старый 11.11.2012, 14:27   #5
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

ну суть в том что scanf нужно адрес (указатель) а array есть такой указатель

ну то есть

Код:
int a = 5;

int *b = &a;

scanf("%d", b);
rUs_LAN вне форума Ответить с цитированием
Старый 11.11.2012, 14:40   #6
Chuckle
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 12
По умолчанию

p51x, rUs_LAN
Спасибо, теперь я понял.

Не подскажите пожалуйста в такой ситуации:
Хочу создать массив из n строк. Но почему-то, когда я ввожу строки, этот фрагмент программы "считает", что я ввел очередную строку, когда в потоке ввода встретился пробел.

Например:
n == 2 (две строки)

Я ввожу:
слово1 слово2 слово 3 *enter* (ввод прекратился)

И если распечатать массив строк, получим:
слово1
слово2


Нужно, чтобы работало так:
Например
n == 2 (две строки)

Я ввожу:
слово1 слово2 слово3 *enter*
слово4 слово5 *enter*

Массив строк должен иметь вид:
слово1 слово2 слово3
слово4 слово5


*enter* - то, что я нажимаю на клавиатуре

Код:
int n, i;
scanf("%d", &n);
char **s = malloc(n);
    for (i = 0; i < n; ++i)
    {
        s[i] = malloc(100 * sizeof(char)); /*в строке не более 100 символов*/
        scanf("%s", s[i]);
    }
Как это можно исправить?
Chuckle вне форума Ответить с цитированием
Старый 11.11.2012, 14:55   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Но почему-то, когда я ввожу строки, этот фрагмент программы "считает", что я ввел очередную строку, когда в потоке ввода встретился пробел.
Документацию читать пробывали?

Цитата:
s String of characters Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.
Цитата:
Как это можно исправить?
Например, заюзать функции типа gets

Последний раз редактировалось p51x; 11.11.2012 в 14:57.
p51x вне форума Ответить с цитированием
Старый 11.11.2012, 15:27   #8
Chuckle
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Документацию читать пробывали?
Например, заюзать функции типа gets
Каюсь, не читал.
Цитата:
s String of characters Any number of non-whitespace characters, stopping at the first whitespace character found.
Предложение немного сумбурное, но смысл, насколько я понимаю, в том, что ввод строки заканчивается пробелом?

Вот, погуглил, вроде бы fgets() используется так, как в коде. Но всё равно ничего не получается. Ввожу n = 2, считывает одну строку только...

Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int n, i;
    scanf("%d", &n);
    char **s = malloc(n);
    for (i = 0; i < n; ++i)
    {
        s[i] = malloc(101 * sizeof(char)); /*в строке не более 100 символов*/
        fgets(s[i], 101, stdin);
    }
    for (i = 0; i < n; ++i)
        printf("%s\n", s[i]);
    return 0;
}
Chuckle вне форума Ответить с цитированием
Старый 11.11.2012, 15:50   #9
Chuckle
Пользователь
 
Регистрация: 13.10.2012
Сообщений: 12
По умолчанию

Кажется я понял, нужно убрать при выводе строки \n
Chuckle вне форума Ответить с цитированием
Старый 11.11.2012, 16:02   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да, или при вводе строки убирать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемножение двух введенных с клавиатуры квадратных матриц 4 порядка Alex Miheev Microsoft Office Excel 3 16.04.2012 19:34
создать массив строк ИВэТэшка Общие вопросы C/C++ 3 04.12.2011 22:19
Чтение данных типа double введенных с клавиатуры Vinnipux Общие вопросы по Java, Java SE, Kotlin 1 16.11.2010 08:22
Присвоить переменной A максимальное значение из введенных с клавиатуры чисел (X,Y,Z,B) Dj-RD Помощь студентам 8 14.03.2010 08:32
Как создать массив заполняемый с клавиатуры? Bravo Общие вопросы C/C++ 2 14.11.2008 00:23