c - printf 未对齐输出

标签 c printf hashtable

在这一行中 printf("%ld,%ld,%s,%s\n", i, j, Songtitle, Interpreter); printf() 给了我一个未对齐的输出,我不明白为什么。 例如:

1. 0,0,2
2.     2
3. 1    0     ----    ----
4. 2    0     ----    ----

这是我的打印功能:

void print_hash(hashcontainer_t *hashcontainer)
{   long i ,j;
    if(hashcontainer == 0)
    {
        fprintf(stderr,"Hashtable is Empty!\n");
        return;
    }
    printf("\n");
    for(i=0;i<hashcontainer->hashsize;i++)
    {
        if(hashcontainer->hasharrays[i].num_entries == 0)
        {
            printf("%ld     0       ----        ----\n",i);
        }
        else
        {
            for(j=0;j<hashcontainer->hasharrays[i].num_entries;j++)
            {
            char *songtitle = hashcontainer->hasharrays[i].entries[j].songtitle;
          char *interpreter = hashcontainer->hasharrays[i].entrie[j].interpreter;
          printf("%ld,%ld,%s,%s\n", i, j,   songtitle, interpreter);
            }    
        }    
    }    
}

这是我的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct hashentry_s
{
    char songtitle[256], interpreter[256];
} hashentry_t;

typedef struct hasharray_s
{
    hashentry_t *entries;
    long num_entries;
} hasharray_t;

typedef struct hashcontainer_s
{
    hasharray_t *hasharrays;
    long hashsize;
} hashcontainer_t;


long hash_key(char songtitle[], char interpreter[], long hash_max)
{
    unsigned long index = 0, i;
    for (i = 0; i < strlen(songtitle); ++i)
        index = 64 * index + (long)(songtitle[i]);
    for (i = 0; i < strlen(interpreter); ++i)
        index = 64 * index + (long)(interpreter[i]);
    return index % hash_max;
}

hashcontainer_t * create_hash (long hashsize )
{
    hashcontainer_t *container=0;
    container = calloc(1,sizeof(hashcontainer_t));
    if(container == 0)
    {
        fprintf(stderr,"Error allocating Memory!\n");
        return 0;
    }
    container->hasharrays = calloc(hashsize,sizeof(hasharray_t));
    if(container->hasharrays == 0)
    {
        fprintf(stderr,"Error Allocating Memory!/n");
        free(container);
        return 0;
    }
    container->hashsize = hashsize;
    return container;
}

void delete_hash ( hashcontainer_t * hashcontainer )
{
    long i;
    if(hashcontainer == 0)
    {
        fprintf(stderr,"Hashtable is Empty!/n");
        return;
    }
    if(hashcontainer->hasharrays == 0)
    {
        fprintf(stderr,"Hasharrays not Allocated or Empty!/n");
        free(hashcontainer);
        return;
    }
    for(i=0;i<hashcontainer->hashsize;i++)
            free(hashcontainer->hasharrays[i].entries);
    hashcontainer->hashsize = 0;
    hashcontainer =0;
    free(hashcontainer->hasharrays);
    free(hashcontainer);
}


void insert_entry(hashcontainer_t *hashcontainer, char songtitle[], char interpreter[])
{
    long key =0,position;
    if(hashcontainer == 0)
    {
        fprintf(stderr,"Memory is not Allocated!\n");
        return;
    }
    key = hash_key(songtitle,interpreter,hashcontainer->hashsize);
    position = hashcontainer->hasharrays[key].num_entries;
    hashcontainer->hasharrays[key].entries = realloc(hashcontainer->hasharrays[key].entries,(position+1)* sizeof(hashentry_t));
   if(hashcontainer->hasharrays[key].entries == 0)
   {
       fprintf(stderr,"Error Allocating New size\n");
       return;
   }
   strcpy(hashcontainer->hasharrays[key].entries[position].songtitle,songtitle);
   strcpy(hashcontainer->hasharrays[key].entries[position].interpreter,interpreter);
   hashcontainer->hasharrays[key].num_entries++;
}


void print_hash(hashcontainer_t *hashcontainer)
{   long i ,j;
    if(hashcontainer == 0)
    {
        fprintf(stderr,"Hashtable is Empty!\n");
        return;
    }
    printf("\n");
    for(i=0;i<hashcontainer->hashsize;i++)
    {
        if(hashcontainer->hasharrays[i].num_entries == 0)
        {
            printf("%ld     0       ----        ----\n",i);
        }
        else
        {
        for(j=0;j<hashcontainer->hasharrays[i].num_entries;j++)
        {
            char *songtitle = hashcontainer->hasharrays[i].entries[j].songtitle;
            char *interpreter = hashcontainer->hasharrays[i].entries[j].interpreter;
            printf("%ld,%ld,%s,%s\n", i, j, songtitle, interpreter);
        }

        }    
    }    
}    

hashentry_t * search_entry ( hashcontainer_t * hashcontainer ,char songtitle [], char interpreter [])
{
    long i ,key;
    if(hashcontainer == 0)
    {
        fprintf(stderr,"hashcontainer not allocated!\n");
        return 0;
    }
    key = hash_key(songtitle,interpreter,hashcontainer->hashsize);
    for(i=0;i<hashcontainer->hashsize;i++)
    {
        if(strcmp(hashcontainer->hasharrays[key].entries[i].songtitle,songtitle)==0 && strcmp(hashcontainer->hasharrays[key].entri interpreter,interpreter)==0)
            return &hashcontainer->hasharrays[key].entries[i];
    }
    return 0;
}
int main()
{
    hashcontainer_t *container=0;
    hashentry_t *found=0;
    char c;
    char songtitle[256],interpreter[256];
    long hashsize;
    while(1)
    {
        printf("\n");
        printf("1- Creat Hash\n");
        printf("2- Insert Hash\n");
        printf("3- Print Hash\n");
        printf("4- Delete Hash\n");
        printf("5- Search Entry\n");
        scanf("%c",&c);
        getchar();
        switch (c)
        {
        case '1':
            printf("Please Insert the size of your hash:   ");
            scanf("%ld",&hashsize);
            getchar();
            printf("\n");
            container = create_hash(hashsize);
            break;
        case '2':
            printf("Please Insert a Songtitle:   ");
            fgets(songtitle,256,stdin);
            printf("\n");
            printf("Please Insert an Interpreter:   ");
            fgets(interpreter,256,stdin);
            printf("\n");
            insert_entry(container,songtitle,interpreter);
            break;
        case '3':
            printf("\n");
            print_hash(container);
            break;
        case '4':
            delete_hash(container);
            break;
        case '5':
            printf("Please Insert the Songtitle that you want to search for:   ");
            fgets(songtitle,256,stdin);
            printf("\n");
            printf("Please Insert the Interpreter:   ");
            fgets(interpreter,256,stdin);
            printf("\n");
            found = search_entry(container,songtitle,interpreter);
            if(found == 0)
                printf("No elements foundn\n");
            else
                printf("Found at %p\n",found);
            break;
        default:
            break;
        }
    }    
}

最佳答案

从您的问题中并不完全清楚“对齐”是什么意思,但我的理解是您希望将数据对齐到这样的列中:

  1, 100,  hello world,   7
100, 100,           no, 100

您可能会在这个简单的示例中看到它:

printf("%d,%d,%s,%s\n", 1, 10, "short", "short");
printf("%d,%d,%s,%s\n", 1, 100, "long long string", "short");

制作:

1,10,short,short
1,100,long long string,short

当您查看printf() documentation时支持的格式是:

%[flags][width][.precision][length]specifier

具有 0 标志(如果您想要打印固定宽度的数字“零填充10 => 0010)。

0 Left-pads the number with zeroes (0) instead of spaces when padding is specified (see width sub-specifier).

宽度参数:

Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.

因此将我的示例扩展为:

printf("%4d,%4d,%20s,%20s\n", 1, 10, "short", "short");
printf("%4d,%4d,%20s,%20s\n", 1, 100, "long long string", "short");

将产生:

   1,  10,               short,               short
   1, 100,    long long string,               short
^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
   4    4                   20                   20

您只需预先决定列宽(任何比列长的数据都会破坏该行)。

关于c - printf 未对齐输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27059382/

相关文章:

c++ - 调色板图像需要有效的调色板

c - 识别位图中设置的位并将其打印在字符串中

Java - 格式化 double 组

algorithm - 就内存而言,二叉搜索树与哈希表

c - 关于 RISC-V 编译器?

c - 如何用C语言学习编程

printf - 在 Julia 中打印特定字符串长度宽度的数字

c - C 中的 printf() 函数

c++ - 如何找到哈希表的大小?

java - 如何将哈希表添加到 NameValuePair 中?