如何为输出流的字符串着色

时间:2018-04-05 16:57:02

标签: c

这是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 [],但是没有效果

2 个答案:

答案 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)返回指向fs中第一次出现的字符串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的情况下计算排名。

  • 通过在点后面指定NULLprintf之间的精度,您只能打印%中字符串的部分内容;有关更多信息,请参阅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的函数,并在字符串sfind中包装特定单词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;
}

我在这里使用尖括号,但分隔字符串当然也可以是用于更改终端颜色的转义序列。