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