Струнные манипуляции - PullRequest
2 голосов
/ 10 мая 2011

Есть ли правильный способ просто скопировать часть строки после определенной точки.

Party City 1422 Evergreen Street

Я использую strpbrk () для копирования имени, я всегда могу просто маркировать его пробелом, но есть ли строковый процесс или метод, где я могу скопировать определенный фрагмент строки, кроме как с самого начала, например copy 1422 Evergreen Street] или удалить первую часть строки?

Ответы [ 6 ]

6 голосов
/ 10 мая 2011

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

РЕДАКТИРОВАТЬ: Когда вы знаете начальную строку, вы можете использовать

char *pos = strstr(src, "1422");
strcpy(dst, pos);
2 голосов
/ 10 мая 2011

Если вам известны индексы первого и последнего символов подстроки, которую вы хотите выбрать, вы должны сделать это с помощью strncpy . Смотрите следующий фрагмент кода, чтобы скопировать символы substringLength из строки inputStr в заданном startIndex.

char * inputStr;
char * outputStr;

strncpy(outputStr, inputStr + startIndex, substringLength);
1 голос
/ 10 мая 2011

На самом деле, strncpy - это , а не - особенно хороший выбор для поставленной задачи.Это всегда увеличивает ваше значение, занимая весь пункт назначения, что, как правило, довольно расточительно (изначально оно было разработано для помещения имен файлов в файловую систему Unix; это хорошо для этого, но не особо).

Я думаю, что я бы использовал sscanf.Предполагая, что мы всегда хотим копировать от первой цифры до конца строки, вы можете сделать что-то вроде этого:

char street_name[256];

sscanf(input_buffer, "%*[^0-9]%255[^\n]", street_name);

FWIW, часть %*[^0-9] пропускает символы, пока не достигнет чего-то в диапазоне0-9 (да, я знаю, что это выглядит как регулярное выражение, но scanf и компания тоже это поддерживают).* в нем означает сканирование, но не назначает то, что находит.%255[^\n] означает чтение и присваивание до следующей новой строки во вводе или до 255 символов, в зависимости от того, что произойдет раньше.

1 голос
/ 10 мая 2011

Если вы хотите разделить в месте определенной строки, вы можете сделать что-то вроде этого:

#define MAX_STRING 1024
int main() {
    char myleftBuffer[MAX_STRING]="";
    char myrightBuffer[MAX_STRING]="";
    char mystring[]="Party City 1422 Evergreen Street";
    char *start = strstr(mystring, "1422");
    if(start) {
        strcpy(myrightBuffer, start);
        strncpy(myleftBuffer, mystring, (start - mystring));
    }
    printf("%s -> %s\n", myleftBuffer, myrightBuffer);
    return;
}

Какие выходы:

Party City  -> 1422 Evergreen Street
0 голосов
/ 10 мая 2011

Вероятно, невозможно в общем случае, и вам лучше получить ввод в отдельных полях, но если это не вариант, то должно сработать следующее:

size_t street_extract(char* ret,size_t retsz,char* addr)
    {
    size_t i,nwrote;
    for(i=0; addr[i] ;i++)
        {
        if(addr[i]!=' ') continue; /* only check at start of word */
        i++;
        if('0' < addr[i] && addr[i] < '9') break; /* found street number */
        }
    if(!addr[i]) return -1; /* not found */

    for(nwrote=0; addr[i+nwrote] && nwrote < retsz-1 ;nwrote++)
        {
        ret[nwrote] = addr[i+nwrote];
        }

    ret[nwrote] = 0;
    while(addr[i+nwrote]) nwrote++;
    return nwrote; /* result is nwrote characters in length */
    }

изменить и при необходимости проверить ошибки.

0 голосов
/ 10 мая 2011
int split_at(const char *in, const char *match, char *buf, size_t len)
{
     char *pos;

    if( (pos = strstr(in, match)) == NULL )
        return -1; // No match
    else if( pos == in )
        return  0; // match is empty

    if( strlcpy(buf, pos, len) >= len )
        fprintf(stderr, "WARNING: match truncated: %s", buf);

    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...