strtok() сплитване по делимитери - въпрос
Здравейте,
искам да прехвърля стринг от вход към char arr[] и да махна делимитерите със strtok() , но да запазя празните позиции (strtok() работи с char arr[])
Стринга се въвежда от потребителя и е с варираща дължина.
Първият проблем, който срещнах, е , че не ми приема размер на char_array[] който не е const. Има ли хитър начин да не се инициализира c-string-а с толкова голям размер?
Вторият ми въпрос е: защо стрингът newLine си остава празен по-долу в кода?
const int char_arr_size_MAX = 500;
main() {
char char_array[char_arr_size_MAX]{0};
for (int i = 0; i < line.size(); i++)
{
char_array[i] = line[i];
}
char * pnewCharArrNoDelimiters;
pnewCharArrNoDelimiters = strtok(char_array, ",.-"); //пойнтер към първия елемент
string newLine;
while (pnewCharArrNoDelimiters != NULL)
{
newLine += *pnewCharArrNoDelimiters;
//дереференцирам, за да вкарам елемента в стринга, но не се получава
//--------> тук newLine си остава празен стринг след присвояването на стойността на първата позиция, защо?
pnewCharArrNoDelimiters = strtok(NULL, ",.-");
}
Благодаря!!
много хубаво инфо за различните начини, това ми трябваше!!!
meanwhile успях да се преборя със strtok() за да събирам в нов стринг само отделни числа / думи, без разделителите, но с празна позиция между тях (за по-нататъшна обработка), получи се много красиво, с два вложени while() :-) ето:
string line;
getline(cin, line);
char char_array[char_arr_size_MAX]{0}; //const int char_arr_size_MAX = 500; //така го бях написала и не ми се сменяше, но ще го пробвам и с динамичната памет
for (int i = 0; i < line.size(); i++)
{
char_array[i] = line[i];
}
char * pnewCharArrNoDelimiters;
char * arrBegin = char_array;
pnewCharArrNoDelimiters = strtok(char_array, ",.-");
string newLine;
int k = 1;
while (k < line.size())
{
newLine += " "; //за да се разделят отделните числа или думи
while (pnewCharArrNoDelimiters != NULL)
{
newLine += *pnewCharArrNoDelimiters;
pnewCharArrNoDelimiters = strtok(char_array + k, ",.-");
//pnewCharArrNoDelimiters е NULL като дойде делимитер; Излиза от вътрешния цикъл; местя k и
//новата стойност на pnewCharArrNoDelimiters Е пойнтер към следващото парче от char arr[], СЛЕД ДЕЛИМИТЕРИТЕ !!!
//вече не е NULL и влиза пак във вътрешния цикъл, да добави следващото парче ДО делимитер
k++;
}
pnewCharArrNoDelimiters = strtok(char_array + k, ",.-");
int difference = pnewCharArrNoDelimiters - arrBegin;
k = difference + 1;
}
Примерен вход: 34,,,,,....567, ...---89
Изход: 34 567 89
Поздрави!