你如何重叠C终端中的文本

时间:2017-09-12 15:36:41

标签: c terminal

我的C编程书中的一个训练练习如下:(翻译自瑞典语)

  

如果您使用书写/打字终端,您有时会像普通的打字机一样,通过踩回线并在单词下面写_来强调单词。编写一个程序,将字符串写入变量s下划线。

我的尝试看起来像这样:

#include <stdio.h>

int main(void) {
  char *s;
  printf("input: ");
  scanf("%ms", &s);
  for (int i=0; s[i] != '\0'; i++) {
    printf("%c\b_", s[i]);
  }
  printf("\n");
  return 0;
}

这不起作用我希望终端输出为:

$> gcc -Wall -std=c99 file.c  
$> ./file.c  
input: test  
test //underlined
$>

但我得到了:

$> gcc -Wall -std=c99 file.c  
$> ./file.c  
input: test  
____  
$> 

有人知道怎么做或者这本书错了吗?

1 个答案:

答案 0 :(得分:1)

我还没有找到一种方法让一个角色的文字呈现在另一个角色上,遗憾的是(我并不认为现代终端有可能这样做,但我很高兴被证明是错误的正如Wumpus Q. Wumbley指出通过less的管道允许这样做。我还没有时间查看它在less内的工作方式/原因。

我想提出一种解决方法 - 有一种方法可以使用ANSI代码\033[4m更直接地强调下划线。

修改您的代码:

#include <stdio.h>

int main()
{
  char *s;

  printf("input: ");
  scanf("%ms", &s);
  printf("\033[4m"); // Enable underlining
  printf("%s", s); // Print your string
  printf("\033[0m"); // Reset text attributes (disable underlining)
  printf("\n");
  return 0;
}

您可以在维基百科上的“CSI代码”部分here中的SGR表中找到其他ANSI图形设置。

\033指定了终端转义码,\e[的组合指定了终端控制信号,然后是<number>m指定我们正在做一个&#34; SGR&#34;,&#34;选择图形再现&#34;命令,作为参数的数字4对应于效果&#34;下划线:单&#34;。 0对应重置。

我欢迎任何更正,因为我对ANSI代码格式一无所知。

我刚刚浏览了less来源,我怀疑它将_\ba之类的序列转换为UTF下划线字符 - 但我还没有完成它的底部。