2016-03-03 4 views
-1

Учитывая строку «красный, желтый, синий, зеленый» Мне нужно написать функцию, которая создает массив с цветами в качестве элементов. У меня возникли проблемы с поиском информации по этой проблеме, потому что мне не разрешено использовать strtok или любые функции манипуляции строками из string.h. Какие-либо предложения?Функция для создания массива из строки в C без strtok

Вот мой код:

int findLength(char string[]){ 
    int l =0; 

    for(l = 0; string[l]!='\0'; l++){ 

    } 
    return l; 
}; 


char *stringToArray(char string[]){ 
    int i = 0; 
    int j = 0; 
    char c = ','; 
    int n = 0; 
    int l = findLength(string); 

    char *str = (char *)malloc(l * sizeof(char)); 

    while(string[i] != '\0'){ 
     if(string[i] == c){ 
      for(n = j; n < i; n++){ 
       str[j++] += string[n]; 
      } 

     } 
     i++; 
    } 
    printf("%s\n", str); 
    str = '\0'; 
    return str; 
} 


int main(int argc, const char * argv[]) { 

    char *string = "red, blue, green,"; 
    char *str = stringToArray(string); 
    free(str); 

    return 0; 

} 
+0

У вас есть специфическая проблема, следующая [ваш предыдущий вопрос] (http://stackoverflow.com/questions/35756596/how-to-create-a-string-from-an-array-of-strings-c) ? –

+1

Какой у вас код? – bruceg

+1

@bruceg Я только что обновил свой код. –

ответ

1

Вы можете цикл через строку, как это после того, как вы найти длину вашей струны:

for(int i=1; i<size; ++i) 

А потом проверить, если текущий символ является буквой, а предыдущее пространство:

if(string[i] >= 97 && string[i] <= 122 && string[i-1] == ' ') //assuming your string has only lower case letters 

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

Помните, что ваше первое слово - это особый случай, потому что перед ним нет пробелов.

+0

'string.length'? И вместо магических чисел используйте '' a'' и '' z''. –

+0

Вы правы, я забыл, что он не должен использовать связанные с строкой методы. Я сейчас это изменю. – ScArL3T

+1

Там * есть * не связанные с строкой методы в C, была моя точка. –

2

Итерация через строку, пока не найдете запятую. Затем скопируйте все от начала и до той точки в отдельную строку в массиве.

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

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

+0

спасибо, что было полезно –

0

[..] массив с цветами элементов [..]

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

char ** parts; // a pointer to a(n array of) pointer(s) to a(n array of) char(s) 

Вам необходимо выделить некоторое пространство для первого элемента parts:

parts = malloc(sizeof(*parts) * 1); // Space for one pointer, to start with 

Теперь вы перебираете строку ввода (строка = указатель на массив символов, последний символ имеет значение '\0') с некоторым указателем (point). Помните начальную позицию (используя указатель start) одну позицию до первый символ вашей строки ввода. Когда во время итерации вы найдете один из ваших разделительных символов (например, ','), затем подсчитайте количество символов между указателями start и point. Если оно больше 0, то выделить память для этого номера + 1 символов и присвоить полученный указатель на последний элемент parts:

// example for the first iteration, you need to change that 0 
parts[0] = malloc(numberOfCharacters + 1); 

Наконец, скопируйте все между start и point в этой вновь выделенной памяти. strncpy будет полезен здесь (если вам не разрешено использовать его, то напишите себе замену. не поместите эту логику в вашу функцию токенизации).

Установите start на номер point.

Если вы не находитесь в конце ввода, получите больше места для хранения большего количества указателей в parts: Это можно сделать, используя realloc. Затем вернитесь к итерации, пока не найдете один из ваших разделительных символов (или конец строки).

Обязательно проверьте каждые (пере) распределение. Прочтите записи для вышеуказанных функций тщательно в ссылке по вашему выбору (пример: http://en.cppreference.com/w/c).

+0

спасибо, что это было очень полезно –

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