C的初学者。
我理解strstr()
可用于查找字符串是否包含某个子字符串,而printf()
可以显示彩色输出(如下所述:stdlib and colored output in C)。
我想弄清楚的是一种简单的方法,只为字符串的匹配部分着色(如grep
中),因为strstr()
返回整个部分来自比赛的线。或者,我可以打印整个匹配线,但最终会使整条线被着色。
假设粗体=着色用于说明目的,我在搜索子串 elephant 时得到的结果是:
这是 elephant 的象牙
printf +着色strstr()
输出给出:
大象的牙齿
当然printf +着色整个匹配的行给出:
这是象牙的象牙
提前感谢您的帮助。
答案 0 :(得分:1)
最简单的解决方案是将打印过程分为三部分。如果strstr返回非NULL结果,则从初始字符串的开头打印字符数,直到达到strstr结果。然后将strstr结果着色,直到"针的长度为#34;匹配。然后打印干草堆的未着色的剩余部分:
const char *color_start, *color_end;
print_head = haystack;
color_start = strstr (haystack, needle);
color_end = color_start + strlen (needle) - 1;
while (*print_head) {
if (print_head == color_start) { /* init color change */ }
else if (print_head == color_end) { /* revert color change */ }
putchar (*print_head++);
}
更有效的版本是:
const char *color_start, *color_end;
print_head = haystack;
color_start = strstr (haystack, needle);
color_end = color_start + strlen (needle) - 1;
while (print_head < color_start)
putchar (*print_head++);
/* init color change */
while (print_head <= color_end)
putchar (*print_head++);
/* revert color change */
while (*print_head)
putchar (*print_head++);
它更有效,因为它只测试每个循环中的一个条件,而不是每个循环最多三个条件。
答案 1 :(得分:1)
&n;因为strstr
从手册
needle
中haystack
的第一次出现的指针
NAME
strstr, strcasestr - locate a substring
SYNOPSIS
#include <string.h>
char *strstr(const char *haystack, const char *needle);
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <string.h>
char *strcasestr(const char *haystack, const char *needle);
DESCRIPTION
The strstr() function finds the first occurrence of the substring
needle in the string haystack. The terminating null bytes ('\0') are
not compared.
The strcasestr() function is like strstr(), but ignores the case of
both arguments.
RETURN VALUE
These functions return a pointer to the beginning of the located
substring, or NULL if the substring is not found.
这是正确的输出,如果你想要那个结果,你必须使用strtok
。