gpt4 book ai didi

c - printf 未对齐输出

转载 作者:行者123 更新时间:2023-11-30 19:18:13 24 4
gpt4 key购买 nike

在这一行中 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com