2014-03-04 3 views
0

У меня возникли проблемы после ввода ввода getchar() в массив char * arr []. Причина, по которой я делаю это, заключается в том, что входные данные, которые будут представлять собой файл с аргументами командной строки, будут храниться в массиве указателей символов, который будет передан функции execvp.Построение массива указателей символов

Я использую getchar(), поэтому я могу позже реализовать функцию, которая позволяет пользователю нажать кнопку «tab» и попробовать и сопоставить файл с уже введенным текстом.

После выполнения приведенной ниже программы, я типа: Ls -a (с завершающими пробелами)

, который, очевидно, должно работать, но не, я получаю ошибку SEG 11. Если кто-то может указать, что я делаю неправильно, это было бы очень хорошо!

Спасибо.

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

int main(){ 

    char *arr[10]; 
    int l_count = 0, w_count = 0; 
    char c; 
    char *curLine; 
    curLine = (char*)calloc(10, sizeof(char)); 
    while((c=getchar()) != '\n'){ 
     if (isspace(c)){ 
      curLine[l_count]='\0'; 
      memcpy(arr[w_count],curLine,strlen(curLine));   
      ++w_count; 
      l_count=0; 
     }  
     else{ 
      curLine[l_count]=c; 
      ++l_count; 
     } 
    } 
    arr[w_count]='\0'; 

    // Testing 
    int i; 
    for (i=0;i<2;i++){ 
     printf("%s, ", arr[i]); 
    } 
    printf("\n"); 

    return 0; 
} 
+0

Вам необходимо выделить новый буфер чтения для каждой итерации через цикл. Для этого не требуется memcpy(), хотя стратегия «realloc()» может быть оправдана, если вы достигнете своего предела распределения, не попав в какое-либо пространство или EOF. Ваше «законченное» обнаружение должно * присваивать * (не memcpy) выделенный строковый указатель на следующий слот в 'arr', а затем начинать с недавно выделенного буфера. – WhozCraig

ответ

0

На самом деле вы хотите это:

int main(){ 
    char *arr[10]; 
    int l_count = 0, w_count = 0; 
    char c; 
    char *curLine; 

    curLine = (char*)calloc(10, sizeof(char)); 

    while (1) 
    { 
     c = getchar() ; 
     if (isspace(c)){ 
      curLine[l_count]='\0'; 
      arr[w_count] = curLine ; 
      ++w_count; 
      l_count=0; 
      curLine = calloc(10, sizeof(char)); 
      if (c == '\n') 
       break ; 
     }  
     else{ 
      curLine[l_count]=c; 
      ++l_count; 
     } 
    } 

    // Testing 
    int i; 
    for (i = 0; i < w_count; i++){ 
     printf("%s, ", arr[i]); 
    } 
    printf("\n"); 

    // free memory 
    for (i = 0; i < w_count; i++){ 
     free(arr[i]); 
    } 

    return 0; 
} 

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

Эта программа работает, даже если есть еще больше проверок, которые необходимо выполнить, например, если вы введете слово с более чем 9 символами, оно переполнит память, выделенную calloc, и если вы введете более 10 слов, то il переполнит arr массив, который имеет длину 10.

BTW в C вы не отбрасывают возвращаемое значение calloc, malloc и realloc.

0

Ну для начала вы не выделили любое пространство в обр для тетсру так этой линии тетсру (обр [w_count], CurLine, STRLEN (CurLine)); копирует yout curLine в случайное место в памяти. Аналогично для всех использования arr позже.

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