如何在C中查找引号之间的子字符串
如果我有一个字符串,比如作为命令的字符串 回声“foobar”|猫 对于我来说,有没有一个好的方法来获取引号(“foobar”)之间的文本?我读到可以使用如何在C中查找引号之间的子字符串,c,string,C,String,如果我有一个字符串,比如作为命令的字符串 回声“foobar”|猫 对于我来说,有没有一个好的方法来获取引号(“foobar”)之间的文本?我读到可以使用scanf在一个文件中执行,也可以在内存中执行吗 我的尝试: char * concat2 = concat(cmd, token); printf("concat:%s\n", concat2); int res = scanf(in, " '%[^']'", concat2); printf("result:%s\n", i
scanf
在一个文件中执行,也可以在内存中执行吗
我的尝试:
char * concat2 = concat(cmd, token);
printf("concat:%s\n", concat2);
int res = scanf(in, " '%[^']'", concat2);
printf("result:%s\n", in);
使用一次,找到您想要的第一个分隔符(”
,在您的例子中),然后再次查找它的结尾对,如下所示:
#include <stdio.h>
#include <string.h>
int main(void) {
const char* lineConst = "echo 'foobar'|cat"; // the "input string"
char line[256]; // where we will put a copy of the input
char *subString; // the "result"
strcpy(line, lineConst);
subString = strtok(line, "'"); // find the first double quote
subString=strtok(NULL, "'"); // find the second double quote
if(!subString)
printf("Not found\n");
else
printf("the thing in between quotes is '%s'\n", subString);
return 0;
}
#包括
#包括
内部主(空){
const char*lineConst=“echo'foobar'| cat”;//输入字符串
字符行[256];//我们将在其中放置输入的副本
char*subString;//结果
strcpy(直线、直线常数);
subString=strtok(行“”);//查找第一个双引号
subString=strtok(NULL,“”);//查找第二个双引号
if(!子字符串)
printf(“未找到”);
其他的
printf(“引号之间的东西是“%s”\n”,子字符串);
返回0;
}
输出:
引号之间的东西是“foobar”
我基于此:如果您的字符串是这种格式-
echo'foobar'| cat”
,则可以使用sscanf
-
char a[20]={0};
char *s="echo 'foobar'|cat";
if(sscanf(s,"%*[^']'%[^']'",a)==1){
// do something with a
}
else{
// handle this condition
}
%*[^']
将读取并丢弃字符串,直到遇到单引号'
,第二个格式说明符%[^']
将读取字符串直到'
并将其存储在a
中 有很多方法可以解决这个问题。通过在字符串中遍历一对指针来定位分隔符,以及string.h
中提供的大量字符串函数。您可以使用字符搜索功能,如strchr
或字符串搜索功能,如strpbrk
,您可以使用标记化功能,如strtok
,等等
仔细看看,向他们学习。下面是一个带有strpbrk
和指针差异的实现。它是非破坏性的,因此不需要复制原始字符串
#include <stdio.h>
#include <string.h>
int main (void) {
const char *line = "'foobar'|cat";
const char *delim = "'"; /* delimiter, single quote */
char *p, *ep;
if (!(p = strpbrk (line, delim))) { /* find the first quote */
fprintf (stderr, "error: delimiter not found.\n");
return 1;
}
p++; /* advance to next char */
ep = strpbrk (p, delim); /* set end pointer to next delim */
if (!p) { /* validate end pointer */
fprintf (stderr, "error: matching delimiters not found.\n");
return 1;
}
char substr[ep - p + 1]; /* storage for substring */
strncpy (substr, p, ep - p); /* copy the substring */
substr[ep - p] = 0; /* nul-terminate */
printf ("\n single-quoted string : %s\n\n", substr);
return 0;
}
不使用string.h 如上所述,您还可以简单地沿着字符串遍历一对指针,并以这种方式找到引号对。为完整起见,下面是一个在一行中查找多个带引号字符串的示例:
#include <stdio.h>
int main (void) {
const char *line = "'foobar'|cat'mousebar'sum";
char delim = '\'';
char *p = (char *)line, *sp = NULL, *ep = NULL;
size_t i = 0;
for (; *p; p++) { /* for each char in line */
if (!sp && *p == delim) /* find 1st delim */
sp = p, sp++; /* set start ptr */
else if (!ep && *p == delim) /* find 2nd delim */
ep = p; /* set end ptr */
if (sp && ep) { /* if both set */
char substr[ep - sp + 1]; /* declare substr */
for (i = 0, p = sp; p < ep; p++)/* copy to substr */
substr[i++] = *p;
substr[ep - sp] = 0; /* nul-terminate */
printf ("single-quoted string : %s\n", substr);
sp = ep = NULL;
}
}
return 0;
}
请仔细阅读所有答案,如果您有任何问题,请告诉我们。@很高兴您理解了这个问题。我选择使用
sscanf
。答案不错!但是,如果未找到,它不会将a
设置为NULL,或者其他。怎么样chara[20]={0}代码>?:)此外,在这种情况下,它将找到我们正在寻找的内容,sscanf()
是否注意\0
?@gsamaras初始化将很好,并且还应检查sscanf
。完全正确!你的回答更优雅,但我会保留我的作为替代+1.@gsamaras是的,做了更改。:)我喜欢这个解决方案,但如果字符串以单引号开头(例如,char*s=“'foobar'| cat”
),原始赋值抑制将失败(这将导致与格式字符串的其余部分匹配)。我尝试了几种替代方案,但找不到一种在两种情况下都有效的方案。您是否对格式字符串有任何建议,无论第一个字符是否为单引号都可以使用?如果没有在原始字符串和strtok搜索标记中插入多余的“\”字符,则值得投票。我断言,他们对这个问题毫无帮助,只是混淆了它。当然,如果原始字符串是echo“foobar”| cat
,我马上就同意了。但事实并非如此。没有什么需要逃避的。事实上,我很好奇你在本例中添加它们的动机。@enhzflep谢谢你,我改进了我的答案,现在好了吗?:)我开始用双引号测试(这需要转义),并计划删除单引号的转义,但后来ameyCU的答案出现了,我赶上了。不客气。我想是的,不过我只是一个人。你已经赢得了我的选票。(开玩笑-->)我在某个地方得到了一个奖杯,上面写着“容易分心”,我每次搜索它时都会被跟踪笑:@enhzflep哈哈,一个有你代表的男人意味着很多。:)希望这有助于行动!
#include <stdio.h>
int main (void) {
const char *line = "'foobar'|cat'mousebar'sum";
char delim = '\'';
char *p = (char *)line, *sp = NULL, *ep = NULL;
size_t i = 0;
for (; *p; p++) { /* for each char in line */
if (!sp && *p == delim) /* find 1st delim */
sp = p, sp++; /* set start ptr */
else if (!ep && *p == delim) /* find 2nd delim */
ep = p; /* set end ptr */
if (sp && ep) { /* if both set */
char substr[ep - sp + 1]; /* declare substr */
for (i = 0, p = sp; p < ep; p++)/* copy to substr */
substr[i++] = *p;
substr[ep - sp] = 0; /* nul-terminate */
printf ("single-quoted string : %s\n", substr);
sp = ep = NULL;
}
}
return 0;
}
$ ./bin/substrp
single-quoted string : foobar
single-quoted string : mousebar