2015-02-11 2 views
0
My Code example: 

char* array = new char[10]; 
char* str; 
int j = 0; 

MyClass(char* input){     //input = sentence columns terminated by '\n' 

    str = new char[strlen(input)]; 

    for(int i=0; i<strlen(input); i++){ 
     if (input[i] == '\n'){   //look for end of line 
     str[i] = '\0';    //add \0 Terminator for char[] 
     array[j] = &(str[i]);   //store address of sentence beginning in array 
     j++; 
     } 
     else{ 
     str[i] = input[i]; 
     } 
    } 
} 

Как сохранить адрес в массиве. Поэтому я могу получить начальный адрес предложения по номеру. Я создал решение с вектором, хранящим мои предложения как объекты char *. Но должен быть путь без векторов ?!Как хранить адреса в массиве - C++?

EDIT:

Это мое решение.

#include <iostream> 

using namespace std; 

class Pointer{ 

public: 

    char** array = new char*[10]; 
    char* str; 
    char* buffer; 
    int j = 1; 

    Pointer(char* input){ 
     str = new char[strlen(input)]; 
     array[0] = str; 
     for (int i = 0; i < strlen(input); i++){ 
      if (input[i] == '\n'){ 
       str[i] = '\0'; 
       array[j] = &(str[i]) + sizeof(char); 
       j++; 
      } 
      else{ 
       str[i] = input[i]; 
      } 
     } 
    } 

    void output(int i){ 
     buffer = array[i]; 
     cout<<buffer; 
    } 
}; 

Благодарим за помощь! :)

+2

У вас есть возможная ошибка переполнения, так как 'strlen' дает длину строки * без * терминатора. –

+0

Что касается вашей проблемы, 'array' не является массивом указателей, это массив символов *. –

+0

Почему вы не хотите использовать векторы? – emlai

ответ

1

Лучше всего было бы использовать STD контейнеры для этого (std::vector<std::string>). В любом случае, если вам нужно иметь это путь C:

В этой строке:

array[j] = &(str[i]); 

вы сохраняете адрес Ith символа строки. Если вы хотите сохранить указатель на всю строку, используйте:

array[j] = str; 

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

КПП. MyClass - это функция, а не класс.

+0

'char * array = new char * [10]' Это не скомпилируется. – emlai

+0

char ** массив = новый char * [10] скомпилируется. MyClass (char * input) - мой конструктор. – stunner2002

+0

Мой плохой! Извините за это, удалив. – rubikonx9

1

Ответ на актуальный вопрос:

char ** array = new (char *)[10]; 

То, что вы, вероятно, следует сделать вместо:

std::vector<std::string> array; 
+0

большое спасибо! :) – stunner2002

0
char* array[10] 
char* str; 
int j = 0; 

MyClass(char* input){     //input = sentence columns terminated by '\n' 

    str = new char[strlen(input)]; 

    for(int i=0; i<strlen(input); i++){ 
     if (input[i] == '\n'){   //look for end of line 
      str[i] = '\0';    //add \0 Terminator for char[] 
      array[j] = str;   //store address of sentence beginning in array 
      // or you can use 
      // array[j] = &(str[0]); 
      j++; 
     } 
     else{ 
      str[i] = input[i]; 
     } 
    } 
} 

Надеюсь, это поможет!

+0

Это не устраняет пробел для ошибки терминатора. Хотя, по моему предположению, всегда будет не менее 1 '\ n' на входе. Я все равно буду исправлять ошибку. – drescherjm

0
class Pointer{ 

public:  
    Pointer(std::string input){ 
      addresses = split(input, '\n', addresses); 
    } 

    void output(int i){ 
      std::cout << addresses.at(i); 
    } 

private: 

    std::vector<std::string> addresses; 
};