比较C

时间:2016-05-30 22:54:19

标签: c string c-strings

所以,我有一个问题。我试图只得到这个例子给出的字符串内部:

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

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个字母。

3 个答案:

答案 0 :(得分:3)

sscanf(3)救援:

public static string getAfter(string strSource, string strStart)
{
int Start, End;
if (strSource.Contains(strStart))
{
    Start = strSource.IndexOf(strStart);
    End = strStart.Length;
    return strSource.Substring(Start, End);
}
else
{
    return "";
}
}

匹配不超过30个字符且不包含char insert[31]; int matched = sscanf(string, "insert(\"%[^\"]30s\")", insert); if (matched) printf("Got %s\n", insert); 并且被"insert("包围的字符串。

答案 1 :(得分:0)

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

注意"插入("实际上是 7 个字符长(如果包含空字节,则为8个),因此与{{1将进行培训'('考虑到 - 不确定这是否是您的问题。

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

答案 2 :(得分:0)

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-terminatedating 字节是由初始化提供的。如果text在同一范围内与strncpy重复使用,则您应该在每次后续使用时肯定 nul-terminate text

示例使用/输出

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