Я наткнулся на приведенный ниже код во время поиска в Google, который прекрасно работает. (Благодарим Чайтанью Бхатт @ Performancecompetence.com)
Приведенная ниже функция ищет последнее вхождение пропущенного разделителя и сохраняет оставшуюся часть входной строки в возвращенную выходную строку.
void strLastOccr(char inputStr[100], char* outputStr, char *delim)
{
char *temp, *temp2;
int i = 0;
temp = "";
while (temp!=NULL)
{
if(i==0)
{
temp2 = temp;
temp = (char *)strtok(inputStr,delim);
i++;
}
if(i>0)
{
temp2 = temp;
temp = (char *)strtok(NULL,delim);
}
lr_save_string(temp2,outputStr);
}
}
В основном пытается добавить две новые опции для передачи.
Номер вхождения: Вместо значения по умолчанию для последнего вхождения, позволяющего указать, в каком вхождении остановиться и сохранить оставшуюся строку.
Часть строки, которую нужно сохранить: (Влево, Вправо) В данный момент строка сохраняет правую сторону, как только найден разделитель. Дополнительная опция предназначена для того, чтобы пользователь мог указать для левой или правой стороны разделителя найден.
void strOccr (char inputStr [100], char * outputStr, char * delim, int * occrNo, char * stringSide)
Итак, вопрос в том, какие модификации мне нужны для вышеуказанной функции?
И действительно ли это возможно сделать?
UPDATE
После того, как я продолжил, я смог найти решение.
Поскольку я не могу ответить на свой вопрос в течение еще 6 часов, будут начисляться баллы тому, кто может обеспечить улучшенную функцию. В частности, мне не нравится код под комментарием "// Удаляет разделитель в конце строки."
void lr_custom_string_delim_save (char inputStr[500], char* outputStr, char *delim, int occrNo, int stringSide)
{
char *temp, *temp2;
char temp3[500] = {0};
int i = 0;
int i2;
int iOccrNo = 1;
temp = "";
while (temp!=NULL) {
if(i==0) {
temp2 = temp;
temp = (char *)strtok(inputStr,delim);
i++;
}
if(i>0) {
temp2 = temp;
temp = (char *)strtok(NULL,delim);
if (stringSide==0) {
if (iOccrNo > occrNo) {
strcat(temp3, temp2);
// Ensure an extra delim is not added at the end of the string.
if (temp!=NULL) {
// Adds the delim back into the string that is removed by strtok.
strcat(temp3, delim);
}
}
}
if (stringSide==1) {
if (iOccrNo <= occrNo) {
strcat(temp3, temp2);
strcat(temp3, delim);
}
}
// Increase the occurrence counter.
iOccrNo++;
}
}
// Removes the delim at the end of the string.
if (stringSide==1) {
for( i2 = strlen (temp3) - 1; i2 >= 0
&& strchr ( delim, temp3[i2] ) != NULL; i2-- )
// replace the string terminator:
temp3[i2] = '\0';
}
// Saves the new string to new param.
lr_save_string(temp3,outputStr);
}