所以,我有一个问题。我试图只得到这个例子给出的字符串内部:
用户输入: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个字母。
答案 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)
strchr
,strncpy
和简单的指针算术也可以做到这一点,例如。
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'