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;
}
非常感谢任何建议,
答案 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 *的引用以保存实际的中间字符串。
结果是新分配的字符串,因此您必须释放它。
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;
}
标记器是一种多功能工具,可用于垃圾场,这只是一个非常小的例子。