我正在尝试匹配整个字符串而不仅仅是它的一部分。例如,如果needle
为2
,我想仅匹配string 2
和not 20, 02, or 22
或任何相关内容。
我正在使用strstr
:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *file;
char l[BUFSIZ];
int linenumber = 1;
char term[6] = "2";
file = fopen(argv[1], "r");
if(file != NULL) {
while(fgets(l, sizeof(l), file)){
if(strstr(l, term) != NULL) {
printf("Search Term Found at %d!\n", linenumber);
}
++linenumber;
}
}
else {
perror(argv[1]);
}
fclose(file);
return 0;
}
答案 0 :(得分:3)
使用strcmp
代替strstr
,或者为了更好的答案,定义“任何相关的内容”。
答案 1 :(得分:2)
strstr
匹配字符串"2"
。如果您不希望它与2
与其他内容相结合的内容匹配,那么您必须准确定义“只是字符串2
”的含义。是2
被空白包围了吗?
我猜你真正想要做的是标记输入(可能在空格或其他东西上分隔),然后检查一个标记是否为字符串"2"
。 (在这种情况下,请使用strtok
和strcmp
。)
答案 2 :(得分:1)
要找到“2”作为唯一单词而不是其他单词的一部分:
- 尝试strstring为“2”(注意前导和尾随空格字符)。
注意:作为特例,
在前两个字符中搜索“2”和
在文件中搜索最后两个字符“2”。
答案 3 :(得分:1)
您必须定义完整的字符串。在您的示例中,“02”“22”和“20”正确匹配,因为“2”完全匹配。如果你只想匹配“单词”,你必须定义“单词”的字符部分是什么,以及哪些字符是分隔符。通常用空格就足够了(用isblank
或isspace
作为制表符检查非破坏空格(ANSI编码中的\ xA0)。有时您可能有其他分隔符“。,; /:+ - ()!?”等。在这种情况下,您必须使用strtok
,或者如果您不能(或不希望)修改输入字符串,则可以使用strspn
和strcspn
。或者甚至更好,在这种情况下,使用正则表达式库。
答案 4 :(得分:1)
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *file;
char l[BUFSIZ];
int linenumber = 1;
char term[6] = "2";
char *p=NULL;
file = fopen(argv[1], "r");
if(file != NULL) {
while(fgets(l, sizeof(l), file)){
p=l;
while((p=strtok(p, " \r\n\0")) != NULL) { // split token with any delimiter \r or \n or \0 or space
if(strcmp(p,term) == 0) //then check each word with term
printf("Search Term Found at %d!\n", linenumber );
p = NULL; //must be null to fetch next word in the line
}
++linenumber;
}
}
else {
perror(argv[1]);
}
fclose(file);
return 0;
}