Копирование строк из stdin в массив символьных указателей - PullRequest
1 голос
/ 20 января 2009

Я хотел бы скопировать строки из стандартного ввода в массив символьных указателей. Например, если пользователь ввел следующее «\ nquick \ nbrown \ nfox», я хотел бы иметь массив, который выглядит как

arr [0] = "the" arr [1] = "быстрый" arr [2] = "коричневый" обр [3] = "лиса"

Есть указатели?

Ответы [ 4 ]

1 голос
/ 20 января 2009

Вам нужен массив символьных указателей и некоторое пространство для них, чтобы указывать на них - то есть один или несколько массивов символов тоже. Существует множество возможностей для этого, от динамического выделения до статически распределенного массивы. Как долго должны быть линии? Это зависит от того, какова ваша среда. (Мне пришлось исправить ошибку в одной из моих программ, потому что она не работала, когда я использовал 4096-байтовый буфер для длины строки, но по крайней мере одна из входных строк содержала более 5000 байтов. Ошибка произошла, потому что я посчитал число новых строк в данных и вышли из цикла, когда ответ был нулевым - не из-за переполнения буфера!)

Один вариант, не упомянутый в других решениях (пока):

  • используйте mmap () для создания частной карты файла в памяти.
  • сканирует отображенную память, чтобы поставить нулевое значение вместо каждой новой строки.
  • убедитесь, что у вас есть указатели для начала строки и сразу после каждого символа, который был символом новой строки, но теперь является нулевым.
1 голос
/ 20 января 2009
1 голос
/ 20 января 2009

Вы должны убедиться, что вы выделили не только массив указателей, но и место для каждого из ваших элементов. Я не проверяю NULL-указатели, как вы должны, но это должно помочь вам начать.

char **arr;
int maxWords = 3;
int i;

arr = malloc (sizeof (char *) * maxWords);

for (i = 0; i < maxWords; i++)
{
    arr[i] = malloc (100);
    fgets (arr[i], 99, stdin);
}

потом вам тоже нужно освободить эту память:

for (i = 0; i < maxWords; i++)
{
    free (arr[i])
}
free (arr);
1 голос
/ 20 января 2009

Используйте getchar () в цикле, чтобы получить ввод за символом. Добавьте символ к текущей строке в цикле, и, если текущий символ является новой строкой '\ n', вместо добавления символа начинайте новую строку.

Я позволю вам разобраться с остальным самостоятельно, а затем, если у вас есть более конкретный вопрос о проблеме, задайте его.

Есть указатели?

0x3A28213A, 0x6339392C, 0x7363682E.

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