c - 在 printf 语句中插入 'n' 制表符

标签 c recursion tabs printf

我正在尝试使用标准字符串置换算法理解递归和回溯(swap --> permute --> swap)

因为我似乎无法理解它是如何回溯、交换字符和排列的,所以我尝试在每次递归 permute() 调用时插入 printfs,并增加缩进“级别”。无论如何,这是代码:

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;
}

我想要的是 printf("%*s", level, "\t"); 在我们进入更深的递归级别时放置递增的制表符。但这不起作用,我得到的文本 block 移动了一个选项卡。

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

知道如何让 printf 插入 (level * '\t') 标签吗?

最佳答案

格式字符串中的 * 不是重复计数;它是最小字段宽度。如果 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() 之前调用它。

关于c - 在 printf 语句中插入 'n' 制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42044341/

相关文章:

c - 子串宏参数

c++ - 未定义的行为 fopen、fclose

java 获取所有可能的变体(正和负)

c - 为什么变量在递归调用中获得相同的地址?

android - ActionBar Sherlock ,操作栏选项卡和 fragment

android - 有没有办法根据 firebase 数据库中的子项数量动态更改 Android 中的选项卡数量?

c - 浮点异常 C. 为什么?

c - Realloc 在循环内第 10 次迭代后失败

python - 递归函数生成二叉树

c# - Sys.InvalidOperationException : Handler must be a function