2010-12-13 2 views
2

У меня возникли проблемы с этим. У меня есть строка C, и я хочу удалить ее первую часть. Скажем так: «Еда, количество, калории». Я хочу скопировать каждый из этих значений, но не запятые. Я нахожу запятую и возвращаю позицию запятой в свой метод. Затем я используюУдалить первую часть строки C

strncpy(aLine.field[i], theLine, end); 

Чтобы скопировать «theLine» в мой массив в положении «I», только первые «конец» символов (в первый раз, «конец» будет 4, потому что это где первая запятая есть). Но тогда, потому что это в Loop, я хочу удалить «Продовольствие» из массива и снова выполнить этот процесс. Однако я не вижу, как я могу удалить первую часть (или переместить указатель массива вперед?) И сохранить остальную часть. Любая помощь будет полезна!

ответ

2

Что вам нужно отрубить строки с запятой в качестве разделителя вашего.

Для этого вам потребуется strtok. Вот пример кода для вас:

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


    char *s = "asdf,1234,qwer"; 
    char str[15]; 
    strcpy(str, s); 
    printf("\nstr: %s", str); 
    char *tok = strtok(str, ","); 
    printf("\ntok: %s", tok); 
    tok = strtok(NULL, ","); 
    printf("\ntok: %s", tok); 
    tok = strtok(NULL, ","); 
    printf("\ntok: %s", tok); 

    return 0; 
} 

Это даст вам следующий вывод:

str: asdf,1234,qwer 
tok: asdf 
tok: 1234 
tok: qwer 
+1

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

+0

yup. Этот код предназначен для демонстрационных целей только в отношении использования strtok. :-) –

+0

@ChrisDodd: поспешно поддержал ваш комментарий (нет отмены), но не согласен. Константная строка '* s' копируется в cstring' str', каждый вызов strtok изменяет cstring (заменяет ',' на '0' terminator) и возвращает адрес токена. Таким образом, нет постоянной строки, доступной только для чтения. Я ошибаюсь? – Salvador

0

Лично я хотел бы использовать strtok().

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

Вместо этого вы должны отслеживать свои позиции и просто копировать разделы, которые хотите добавить к новой строке.

Но, опять же, я использовал бы strtok().

0

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

, например

void readTheString(const char *theLine) 
{ 
    const char *wordStart = theLine; 
    const char *wordEnd = theLine; 

    int i = 0; 
    while (*wordStart) // while we haven't reached the null termination character 
    { 
     while (*wordEnd != ',') 
      wordEnd++; 
     // ... copy the substring ranging from wordStart to wordEnd 
     wordStart = ++wordEnd; // start the next word 
    } 
} 

или что-то в этом роде.
Проверка нулевого завершения, вероятно, неверна, если строка также не заканчивается символом «,» ... но вы получаете эту идею.

в любом случае, используя strtok, вероятно, будет лучшей идеей.

2

Если вам нужно сохранить исходную строку, то strtok. Если нет, то вы можете заменить каждый сепаратор с '\0', и использовать полученные строки непосредственно:

char s_RO[] = "abc,123,xxxx", *s = s_RO; 
while (s){ 
    char* old_str = s; 
    s = strchr(s, ','); 
    if (s){ 
     *s = '\0'; 
     s++; 
    }; 
    printf("found string %s\n", old_str); 
}; 

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

  • Нет связанных вопросов^_^