2013-12-02 2 views
1

Мне нужно выделить массив из 1000 указателей на символьные строки, прочитать в каждой строке символов из stdin и strdup каждую строку в массив. Я сделал следующее:Строка каждой строки в массив?

char *array[1000]; 
int index = 0; 
for (int i = 0; i < 1000; i++) { 
     scanf("%s", &array[i]); 
     strdup(array[i]); 
} 

Я не уверен, что это правильный способ обойтись?

EDIT:

Итак, мне нужно подключить символ новой строки в конце каждой строки с нулевым символом, и мне нужно сделать это с помощью функции STRLEN. У меня есть следующее:

// Plug the newline where the end of 
    // a line is equal to '0/' 
    index = strlen(array) - 1; // line 30 
    if (array[index] = '\n') { // line 31 
    array[index] = '\0'; 
    } 

Но Im получаю следующее сообщение об ошибке:

linesort.c: In function ‘main’: 
linesort.c:30: warning: passing argument 1 of ‘strlen’ from incompatible pointer type 
/usr/include/string.h:399: note: expected ‘const char *’ but argument is of type ‘char **’ 
linesort.c:31: warning: assignment makes pointer from integer without a cast 
linesort.c:31: warning: suggest parentheses around assignment used as truth value 

Пожалуйста, посоветуйте!

+0

Мне любопытно, если вы пробовали это? –

+0

'scanf ("% s "...)' не является хорошим способом чтения в строках данных (если, возможно, если ваши строки никогда не имеют пробелов). 'fgets()' может быть лучшим выбором, или 'getline()', если эта нестандартная (но общая) функция библиотеки доступна вам. –

+0

@MichaelBurr Как бы я вставлял новую строку в конце каждой строки с «\ 0», а не с ошибкой, если нет новой строки? Я не уверен, как это сделать. – YoshiK

ответ

1

Вам нужен промежуточный массив. Вы не можете просто хранить в памяти неинициализированного здесь scanf("%s", &array[i]);

char *array[1000]; 
char buf[50] ; 
char buf2[50] ; 

for (int i = 0; i < 1000; i++) { 
    scanf("%49s", buf); 
    snprintf(buf2 , sizeof(buf) , "%s\n" , buf) ; 
    array[i] = strdup(buf2); 
} 
return 0 ; 
} 
+0

Как подключить новую строку в конце каждой строки с «\ 0», а не с ошибкой, если нет новой строки? – YoshiK

+0

@YoshiK Но я бы предпочел использовать fgets для чтения строк. – this

0

Нет

char *array[1000]; 

for (int i = 0; i < 1000; i++) { 
     scanf("%s", &array[i]); <-- array[i] has no memory here!! 
     strdup(array[i]); <-- array[i]=strdup(string) 
} 

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

0

Это очень вряд ли будет работать. У вас есть массив указателей, и это нормально, но вы читаете в неопределенную память, используя scanf("%s", &array[i]);, так как на самом деле это не указывает на какой-либо действительный хранилище.

Вместо этого вам необходимо выделить временный буфер, например.

char tmp[500]; 
scanf("%s", tmp); 

Затем используйте strdup во временном буфере, например.

array[i] = strdup(tmp); 
+0

Кто-то на другом посту сказал, что scanf ("% s, tmp) не читает строку ввода, а только непрерывную последовательность небелого пространства – YoshiK

Смежные вопросы