在printf语句中插入'n'选项卡

时间:2017-02-04 19:01:04

标签: c recursion tabs printf

我正在尝试使用标准字符串排列算法void permute(char arr[], int L, int R, int level) { int i = 0; level = level+1; if(L == R) { printf("%*s", level, "\t"); printf("printing : %s\n", arr); } else { for(i = L; i <= R; i++) { printf("%*s", level, "\t"); printf("swapping %c with %c\n", arr[L], arr[i]); SWAP(&arr[L], &arr[i]); permute(arr, L+1, R, level); printf("%*s", level, "\t"); printf("swapping back %c with %c\n", arr[i], arr[L]); SWAP(&arr[L], &arr[i]); } } } int main() { char str[] = "abc"; permute(str, 0, 2, 0); return 0; }

来理解递归和回溯

由于我似乎无法理解它如何回溯,交换字符和置换,我试图在每次递归permute()调用时插入printfs并增加缩进“级别”。无论如何这里是代码:

printf("%*s", level, "\t");

当我们进入更深层次的递归级别时,我想要swapping a with a swapping b with b printing : abc swapping back b with b swapping b with c printing : acb swapping back b with c swapping back a with a swapping a with b swapping a with a printing : bac swapping back a with a swapping a with c printing : bca swapping back a with c swapping back a with b swapping a with c swapping b with b printing : cba swapping back b with b swapping b with a printing : cab swapping back b with a swapping back a with c 放置递增选项卡。但这不起作用,我正在通过一个标签移动一个文本块。

(level * '\t')

知道如何让printf插入root@07ff3fbcb3cd:/# libreoffice --version LibreOffice 5.2.4.2.1 20m0(Build:2) root@07ff3fbcb3cd:/# libreoffice --headless --convert-to pdf --outdir . rapport.docx convert /rapport.docx -> /rapport.pdf using filter : writer_pdf_Export root@07ff3fbcb3cd:/# 标签吗?

3 个答案:

答案 0 :(得分:2)

格式字符串中的*不是重复计数;它是最小字段宽度。如果level为19,%*s将打印19个字符,但字符串中只有一个标签,因此它始终只打印一个标签和18个空格。该字符串将是右对齐的(左对齐没有-标志),因此有18个空格和一个标签。

#include <stdio.h>

int main(void)
{
    int level = 19;
    printf("[%*s]\n", level, "\t");
    return 0;
}

您需要一系列标签,例如"\t\t\t\t\t\t\t\t\t\t\t\t",其长度超过您要访问的最深层次。或者你需要一个小函数来缩进适当数量的标签:

static inline void indent(int n)
{
    for (int i = 0; i < n; i++)
        putchar('\t');
}

并在致电printf()之前致电。

答案 1 :(得分:1)

您可以使用for循环:例如

for(int j = 0;j<level;j++) 
    printf("\t");

答案 2 :(得分:0)

最简单的方法:

#include <stdio.h>
    
int main (void)
{
    printf("how i do this\t");
    for(int i = 1 ; i <= 9; i++ ) {
        printf("    ");
    }
    printf("gotit");
    
    return 0;
}

根据需要工作。您只需要将第一个标签放在for部分之前,就可以位于普通标签位置,并且由于一个标签仅用于空格,因此您可以根据需要多次打印4个空格。

别忘了您想要的数量-您之前做过的第一个标签,所以在这里我想将其设置为文本后的第10个位置,因此9次后我停止了循环。例如,如果您想要1000,只需将9替换为999