从c字符串中删除字符

时间:2010-07-30 11:54:46

标签: c

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 个答案:

答案 0 :(得分:3)

不,这不起作用。您正在更改参数temp,但调用函数仍将具有旧值。函数外的temp将指向开头报价。你应该移动缓冲区中的字符。

但是我建议在堆中分配缓冲区并返回指向它的指针,让调用者在需要时释放缓冲区。这似乎是一个更清洁的解决方案。同样,这样您就不会依赖调用者来传递足够大的缓冲区。

通常,来自文本文件的强大读取行在C中不是一项简单的任务,缺乏自动内存分配功能。如果可以切换到C ++,我建议尝试更简单的C ++ getline

答案 1 :(得分:2)

所有行看起来都是这样,为什么不简单地删除第一个和最后一个字符?

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

答案 2 :(得分:2)

假设

  

string =“\”辛普森,荷马\“”

然后

  

string_without_quotes =串+ 1;

     

string_without_quotes [strlen的(字符串)-2] = '\ 0';

准备!

答案 3 :(得分: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;
}

简单泛型删除一个字符

答案 4 :(得分: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;
}

参数是:

  • char * start,(指向字符串的指针)
  • char * delim,(指向用于分解字符串的分隔符的指针)
  • char ** tok,一个引用(使用&amp;)到一个将保存toke的char *变量
  • char ** nextpos,一个引用(使用&amp;)到char *变量,它将保留最后一个标记之后的位置。
  • char * sdelim,一个引用(使用&amp;)到一个char变量,它将保存-start分隔符的值
  • char * edelim,一个引用(使用&amp;)到char变量,它将保存结束分隔符的值

最后三个是可选的。

传入起始地址,分隔符为“,并传递对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;
}

标记器是一种多功能工具,可用于垃圾场,这只是一个非常小的例子。