strcpy () и массивы строк - PullRequest
       43

strcpy () и массивы строк

3 голосов
/ 10 октября 2010

Мне нужно сохранить ввод от пользователя в массив строк.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *history[10] = {0};

int main (void) {

    char input[256];

    input = "input";

    strcpy(history[0], input);

    return (EXIT_SUCCESS);

}

Запустив его на терминале, я получаю ошибку сегментации, а в NetBeans я получаю main.c: 11: error:несовместимые типы в присваивании.Я также попытался сдвинуть всю историю, чтобы сохранить самый новый ввод в первую позицию (history [0]).

history[9] = history[8];
history[8] = history[7];
history[7] = history[6];
history[6] = history[5];
history[5] = history[4];
history[4] = history[3];
history[3] = history[2];
history[2] = history[1];
history[1] = history[0];
history[0] = input;

Но это приводит к выводу, подобному этому.

Если input равен "вход "

История 0: история ввода 1: ноль и т. д.

Если тогда ввод" новый "

История 0: новая история 1: новая история 2: ноль и т.д..

Каждый раз при вводе нового ввода указатели на сдвиг строки, но это приводит к тому, что в массиве истории сохраняется только самое новое значение.

Ответы [ 3 ]

4 голосов
/ 11 октября 2010

Вам необходимо выделить место для строки.Это можно сделать несколькими способами, два ведущих претендента выглядят так:

char history[10][100];

и

char *history[10];
for (j = 0;  j < 10;  ++j)
    history [j] = malloc (100);

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

1 голос
/ 11 октября 2010

strcpy() не выделяет новую область памяти для строки, он только копирует данные из одного буфера в другой. Вам нужно выделить новые буферы, используя strdup() или создать предварительно выделенный массив (char history[10][100];). В этом случае не пытайтесь перемещать указатели и используйте strcpy для копирования данных.

0 голосов
/ 11 октября 2010
main.c:11: error: incompatible types in assignment
(Code: input = "input";)

Это происходит потому, что вы пытаетесь настроить массив 'input', чтобы он указывал на строку "input". Это невозможно, так как массив является константным указателем (то есть значение, на которое он указывает, изменить нельзя).

Правильный способ сделать то, что вы пытаетесь это:

strcpy(input,"input");

Конечно, это небольшая проблема, основная проблема уже была опубликована дважды. Просто хотел указать на это.

Кстати, я не знаю, как вы компилируете это, когда запускаете его на терминале. Вы не получили ошибку? Может просто предупреждение? Попробуйте скомпилировать с -Wall -pedantic

...