我的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
____
$>
有人知道怎么做或者这本书错了吗?
答案 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下划线字符 - 但我还没有完成它的底部。