这是Linux grep命令的功能,(它基本上搜索特定的单词并打印出具有该单词的每一行)
如何修改此功能,为我在"红色"中寻找的单词上色? ? (我想只为这个词着色,而不是整个句子)
#include<stdio.h>
#include<string.h>
void main()
{
char fn[10],pat[10],temp[200];
FILE *fp;
printf("Enter file name\n");
scanf("%s",fn);
printf("Enter pattern to be searched\n");
scanf("%s",pat);
fp=fopen(fn,"r");
while(!feof(fp))
{
fgets(temp,1000,fp);
if(strstr(temp,pat))
printf("%s",temp);
}
fclose(fp);
}
我可以添加颜色
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_YELLOW "\x1b[33m"
#define ANSI_COLOR_BLUE "\x1b[34m"
但是,我怎样才能设计将每一行分成单词,然后在不使用strtok()的情况下将每个单词与我的输入相匹配的逻辑, 我试图扩展
if(strstr(temp,pat))
printf("%s",temp);
并为i和j添加一个数组newString[] and match it with
temp []来检查newString []是否等同于pat [],但是没有效果
答案 0 :(得分:1)
#include <stdio.h>
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KWHT "\x1B[37m"
int main()
{
printf("%s%s\n", KRED, "mystr");
printf("%s%s\n", KGRN, "mystr");
printf("%snormal\n", KNRM);
return 0;
}
这应该有效。 现在,您可以尝试使用上述想法修改示例中的printfs。 这就是你现在可以做的:(只是指针操作)
int main () {
char hay[] = "haystack";
char *needle = "ay";
char *ptr = strstr(hay, needle);
if (ptr)
{
int i = 0;
int len = strlen(needle);
char x = ptr[0];
ptr[0] = 0;
fprintf(stdout, "%s%s", KGRN, hay);
ptr[0] = x;
x = ptr[len];
ptr[len]=0;
fprintf(stdout, "%s%s", KRED, ptr);
ptr[len]=x;
ptr += len;
fprintf(stdout, "%s%s\n", KGRN, ptr);
}
return 0;
}
答案 1 :(得分:0)
有两件事可以帮到你:
函数strstr(s, f)
返回指向f
或s
中第一次出现的字符串NULL
的指针,如果它不出现在{{1}中}}。因为s
是一个C字符串 - 一个以空字符结尾的字符数组 - 你可以在结果上使用指针算法来获得确切的位置:
s
请确保仅在const char *s = "abcde";
const char *p = strstr(s, "c"); // p == &s[2] == s + 2
int pos = p - s; // pos == 2
的结果不是strstr
的情况下计算排名。
通过在点后面指定NULL
和printf
之间的精度,您只能打印%
中字符串的部分内容;有关更多信息,请参阅s
格式字符串文档。该精度可以是星号,在这种情况下,它可以从参数列表中读取:
printf
由于const char *s = "Hello world!";
printf("%s.50s\n", s); // printf "Hello, world!"
printf("%s.4s\n", s); // prints "Hell"
printf("%s.*s\n", 5, s); // prints "Hello"
的工作原理,参数(最后一行中的printf
)必须是5
,而不是任何整数类型。小心。
我们可以使用这两个功能编写一个打印字符串int
的函数,并在字符串s
和find
中包装特定单词open
的所有匹配项:
close
打印:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void put(const char *s, const char *find,
const char *open, const char *close)
{
int flen = strlen(find);
const char *m = strstr(s, find);
while (m) {
int l = m - s;
printf("%.*s", l, s);
printf("%s%s%s", open, find, close);
s = m + flen;
m = strstr(s, find);
}
puts(s);
}
int main()
{
put("Yo-ho-ho! A short life, far from home, ahoy!", "ho", "<", ">");
return 0;
}
我在这里使用尖括号,但分隔字符串当然也可以是用于更改终端颜色的转义序列。