Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中查找引号之间的子字符串_C_String - Fatal编程技术网

如何在C中查找引号之间的子字符串

如何在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

如果我有一个字符串,比如作为命令的字符串

回声“foobar”|猫

对于我来说,有没有一个好的方法来获取引号(“foobar”)之间的文本?我读到可以使用
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