удалить символы из строки c - PullRequest
1 голос
/ 30 июля 2010

gcc 4.4.4 c89

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

"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;
}

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

Ответы [ 5 ]

3 голосов
/ 30 июля 2010

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

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

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

2 голосов
/ 30 июля 2010

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

#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;
}

Параметры:

  • char * start, (указатель на строку)
  • char * delim, (указатель на разделители, используемые для разбиения строки)
  • char ** tok, ссылка (с использованием &) на переменную char *, которая будет содержать токен
  • char ** nextpos, ссылка (с использованием &) на переменную char *, которая будет удерживать позицию после последнего токена.
  • char * sdelim, ссылка (с использованием &) напеременная char, которая будет содержать значение разделителя -start
  • char * edelim, ссылку (с помощью &) на переменную char, которая будет содержать значение конечного разделителя

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

Передайте начальный адрес, разделитель - ", и передайте ссылку на символ * для хранения фактической средней строки.

Результат - вновь выделенныйСтрока, поэтому вы должны освободить ее.

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;
}

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

2 голосов
/ 30 июля 2010
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 голосов
/ 30 июля 2010

Предположим,

string = "\" Симпсон, Гомер \ ""

тогда

string_without_quotes = строка + 1

string_without_quotes [STRLEN (строка) -2] = '\ 0';

готово!

2 голосов
/ 30 июля 2010

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

quote++; // move over second char
quote[strlen(quote)-1]='\0'; // remove last char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...