【问题标题】:Comparing certain contents of a string in C比较C中字符串的某些内容
【发布时间】:2016-05-30 22:54:18
【问题描述】:

所以,我有一个问题。我试图只获取此示例给出的字符串内部:

用户输入:insert("someWord")
我想首先确保用户正确拼写了 insert(",然后我想复制包含在 "" 中的字符串。截至目前,我有一个带有参数的函数,它是完整的用户输入,并且在里面功能,我有以下:

method header(char *string){
  char insert[]="insert(";
  if((strncmp(string,insert,6)==0)
   {
     //the first part was right up to the "
     //how do I now get the string contained between " "?
   }
  else
   {  //invalid input
   }
}

我什至不是 100% 肯定 strncmp 方法正确比较了两个字符串的前 6 个字母。

【问题讨论】:

  • “我什至不是 100% 肯定 strncmp 方法正确比较了两个字符串的前 6 个字母。”为什么不?测试您的代码或阅读strcmp man page 不会为您提供这些信息吗?至于提取子字符串,只需浏览standard string functions 的其余部分,看看哪些可以帮助您。例如,您可以使用strtok" 作为分隔符或使用strchr 来查找内部字符串的开始和结束位置。
  • 另外,"insert(" 是 7 个字符而不是 6 个字符。最好使用 strlen(insert) 而不是硬编码的数字。它也不包括( 之后的" 字符,您似乎也想匹配。

标签: c string c-strings


【解决方案1】:

sscanf(3) 救援:

char insert[31];
int matched = sscanf(string, "insert(\"%[^\"]30s\")", insert);
if (matched) printf("Got %s\n", insert);

这匹配一个不超过 30 个字符且不包含 " 并被 insert("") 包围的字符串。

【讨论】:

  • 您可能希望缓冲区大 1 个字节,因为 scanf 将在 30 字节字符串之后添加空终止,需要 31 个字节的存储空间.....
【解决方案2】:

strncmp 将比较确切的字符数或在看到第一个空值时终止。

所以,

strncmp("inser","insert(",6)     // false -- the first string too short
strncmp("insert","insert(",6)    // true, the first 6 char match
strncmp("insert(","insert(",6)   // true, first 6 char match
strncmp("insertxyz","insert(",6) // true, the first 6 chars match
strncmp("insert","inse",6)       // false -- the second string too short
strncmp("append","insert",6)     // false -- they just don't match

注意“insert(”实际上是 7 个字符长(如果包含空字节,则为 8 个字符),因此与strncmp(,,6) 比较将不 将训练 '(' 考虑在内 - 不确定这是否是您的问题。

在您的情况下,没有真正的理由使用 strncmp - 只需使用 strcmp 代替(或 a3f 建议的 sscanf 解决方案)

【讨论】:

    【解决方案3】:

    strchrstrncpy 和简单的指针算法也可以解决问题,例如

    method header(char *string){
        char insert[]="insert(";
        if (strncmp (string, insert, 6) == 0) {
            char text[MAXC] = "", *p = string + 7, *ep = NULL;
            if ((ep = strchr (p, ')')) && ep - p < MAXC)
                strncpy (text, p, ep - p);
            printf ("header text: '%s'\n", text);
        }
        else {  //invalid input
        }
    }
    

    在括号之间打印所需文本的简短示例(文本不能包含嵌入的右括号)。

    #include <stdio.h>
    #include <string.h>
    
    #define MAXC 128
    
    void header (char *string);
    
    int main (void) {
    
        char string[] = "insert(headerinfo)";
    
        header (string);
    
        return 0;
    }
    
    void header (char *string)
    {
        char insert[] = "insert(";
        if (strncmp (string, insert, 6) == 0) {
            char text[MAXC] = "", *p = string + 7, *ep = NULL;
            if ((ep = strchr (p, ')')) && ep - p < MAXC)
                strncpy (text, p, ep - p);
            printf ("header text: '%s'\n", text);
        }
        else {  //invalid input
        }
    }
    

    注意: nul-terminating 字节是通过初始化提供的。如果textstrncpy 在同一范围内重复使用,则每次后续使用都应该nul-terminate text

    使用/输出示例

    $ ./bin/headertxt
    header text: 'headerinfo'
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-07-07
      • 2013-03-21
      相关资源
      最近更新 更多