2010-07-30 2 views
1

gcc 4.4.4 c89удалить символы из строки c

Я читаю текст из текстового файла, а текстовый файл состоит из имен в двойных кавычках.

"Simpson, Homer" 
etc 

Однако, я хочу удалить двойные кавычки из строки.

Вот как я это сделал, но я не уверен, что это лучший способ.

int get_string(FILE *in, char *temp) 
{ 
    char *quote = NULL; 
    /* Get the first line */ 
    fgets(temp, STRING_SIZE, in); 
    printf("temp before [ %s ]\n", temp); 
    /* Find the second quote */ 
    if((quote = strrchr(temp, '"')) == NULL) { 
     fprintf(stderr, "Text file incorrectly formatted\n"); 
     return FALSE; 
    } 
    /* Replace with a nul to get rid of the second quote */ 
    *quote = '\0'; 

    /* Move the pointer to point pass the first quote */ 
    temp++; 
    printf("temp after [ %s ]\n", temp); 
    return TRUE; 
} 

Большое спасибо за любые предложения,

ответ

3

Нет, это не будет работать. Вы меняете параметр temp, но вызывающая функция по-прежнему будет иметь старое значение. temp вне функции укажет на вводную цитату. Вы должны переместить символы в буфер.

Однако я бы предложил выделить буфер в кучу и вернуть указатель на него, позволяя вызывающему абоненту освободить буфер при необходимости. Это, кажется, более чистое решение. Опять же, таким образом вы не будете полагаться на вызывающего, чтобы передать достаточно большой буфер.

В целом, надежные строки считывания из текстового файла не являются тривиальной задачей в C, при этом отсутствуют функции автоматического распределения памяти. Если возможно перейти на C++, я бы предложил попробовать гораздо проще C++ getline.

+1

в качестве альтернативы, ОП можно использовать 'memmove (температура, температура + 1, STRLEN (темп + 1) + 1); 'сдвинуть строку в буфере (вместо' temp ++; '). – caf

+0

@caf: Это то, что я имел в виду как «должен перемещать символы в буфере». – Vlad

+0

Да, я не собирался комментировать вас, больше для OP. – caf

2

все линии выглядят так, почему бы не просто удалить первый и последний символ?

quote++; // move over second char 
quote[strlen(quote)-1]='\0'; // remove last char 
+0

То же решение, что и у меня, но с использованием той же переменной, отлично..ok моя работало бы, даже если строка const char * = P, +1 для более быстрого ответа –

+0

Поскольку последний символ на самом деле почти наверняка является '\ n', , так как он читался с помощью 'fgets()' (но обратите внимание, что «второй-последний символ» тоже недостаточно хорош, если последняя строка в файле не имеет '\ n'!) – caf

+0

.. и возможно, у вас есть запасные пространства. – Vlad

2

Пусть

строка = "\" Симпсон, Гомер \ ""

затем

string_without_quotes = строка + 1;

string_without_quotes [strlen (string) -2] = '\ 0';

готово!

2
char *foo(char *str, int notme) 
{ 
    char *tmp=strdup(str); 
    char *p, *q; 
    for(p=str, q=tmp; *p; p++) 
    { 
     if((int)*p == notme) continue; 
     *q=*p; 
     q++; 
    } 
    strcpy(str, tmp); 
    free(tmp); 
    return str; 
} 

простой общий удалить символ

2

Не знаю, если это поможет, это просто токенизатор я использую

#include <stdlib.h> 
#include <string.h> 

int token(char* start, char* delim, char** tok, char** nextpos, char* sdelim, char* edelim) { 
    // Find beginning: 
    int len = 0; 
    char *scanner; 
    int dictionary[8]; 
    int ptr; 

    for(ptr = 0; ptr < 8; ptr++) { 
     dictionary[ptr] = 0; 
    } 

    for(; *delim; delim++) { 
     dictionary[*delim/32] |= 1 << *delim % 32; 
    } 

    if(sdelim) { 
     *sdelim = 0; 
    } 

    for(; *start; start++) { 
     if(!(dictionary[*start/32] & 1 << *start % 32)) { 
      break; 
     } 
     if(sdelim) { 
      *sdelim = *start; 
     } 
    } 

    if(*start == 0) { 
     if(nextpos != NULL) { 
      *nextpos = start; 
     } 
     *tok = NULL; 
     return 0; 
    } 

    for(scanner = start; *scanner; scanner++) { 
     if(dictionary[*scanner/32] & 1 << *scanner % 32) { 
      break; 
     } 
     len++; 
    } 

    if(edelim) { 
     *edelim = *scanner; 
    } 

    if(nextpos != NULL) { 
     *nextpos = scanner; 
    } 

    *tok = (char*)malloc(sizeof(char) * (len + 1)); 

    if(*tok == NULL) { 
     return 0; 
    } 

    memcpy(*tok, start, len); 
    *(*tok + len) = 0; 


    return len + 1; 
} 

Параметры:

  • голец * start, (указатель на строку)
  • char * delim, (указатель на разделители u СЭД, чтобы разбить строку)
  • обугленного ** Tok, ссылку (используя &) к полукоксу * переменной, которая будет содержать Toke
  • полукокс ** nextpos, ссылку (используя &) к полукоксу * переменному который будет удерживать позицию после последнего токена.
  • символ * sdelim, ссылка (с использованием &) к переменной полукокса, который будет содержать значение -start разделителя
  • символ * edelim, ссылка (с использованием &) к полукокса Название переменной, которая будет содержать значение конечный разделитель

Последние три являются необязательными.

Pass в начальный адрес, то разделитель является», и передать ссылку на символ *, чтобы держать фактическую среднюю строку.

В результате вновь распределённая строка, так что вы должны освободить его.

int get_string(FILE *in, char *temp) 
{ 
    char *token = NULL; 
    /* Get the first line */ 
    fgets(temp, STRING_SIZE, in); 
    printf("temp before [ %s ]\n", temp); 
    /* Find the second quote */ 
    int length = token(temp, "\"", &token, NULL, NULL, NULL) 

    // DO STUFF WITH THE TOKEN 
    printf("temp after [ %s ]\n", token); 
    // DO STUFF WITH THE TOKEN 

    // FREE IT!!! 
    free(token); 
    return TRUE; 
} 

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

+0

Я знаю, что это не идеальное использование токенизатора, но я чувствую, что это хороший инструмент для использования и во многих ситуациях. –

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