我正在尝试将这些字符串与各自的索引对齐。字符串看起来像这样:
char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};
我的输出如下:
Fred 0
Augustine 1
Bob 2
Lenny 3
Ricardo 4
但我追求的是这样的事情:
Fred 0
Augustine 1
Bob 2
Lenny 3
Ricardo 4
因此索引对齐相同。我只是想让它更具可读性。这是我的代码到目前为止的样子:
#include <stdio.h>
#include <stdlib.h>
int
main(void) {
int i;
char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};
for (i = 0; i < 5; i++) {
printf("%s %d\n", mystrings[i], i);
}
return 0;
}
有没有办法可以做到这一点?比如将索引与最长的字符串进行比较,然后为这样的整数创建空格?
答案 0 :(得分:6)
计算最大宽度的额外循环,然后使用*
printf标志从参数中取宽度(乘以-1以引起左对齐)
char *mystrings[] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};
int width = 0;
for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) {
width = strlen(mystrings[i]) > width? strlen(mystrings[i]) : width;
}
for (int i = 0; i < sizeof(mystrings)/sizeof(char*); i++) {
printf("%*s %d\n", -1 * width, mystrings[i], i);
}
答案 1 :(得分:2)
您需要在格式规范中指定字符串的宽度
然后,您需要使用-
说明符来指示您希望输出左对齐。
使用
printf("%-10s %d\n", mystrings[i], i);
将为mystrings[i]
使用10个字符,并将保证输出的合理性。
如果您不知道字符串的长度,那么对这样的数字进行硬编码就会出问题。为了使您的程序有点健壮,您可以计算字符串的最大长度,然后从中计算格式字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 5
int main(void) {
int i;
char *mystrings[MAXSIZE] = {"Fred", "Augustine", "Bob", "Lenny", "Ricardo"};
int maxLen = 0;
for (i = 0; i < MAXSIZE; i++) {
int len = strlen(mystrings[i]);
maxLen = (len > maxLen) ? len : maxLen;
}
char formatString[50];
sprintf(formatString, "%%-%ds %%d\n", maxLen + 1);
for (i = 0; i < MAXSIZE; i++) {
printf(formatString, mystrings[i], i);
}
return 0;
}
输出
Fred 0
Augustine 1
Bob 2
Lenny 3
Ricardo 4
答案 2 :(得分:2)
您需要做的是达到字符串的最大长度。您可以获取字符串的最大长度,然后使用一些简单的算法来计算您需要多少填充(字符串末尾的空格)。不使用printf
,出于教育目的,我会告诉你如何做到这一点。
输出:
Fred 0
Augustine 1
Bob 2
Lenny 3
Ricardo 4
以下是一个例子:
#include <stdio.h>
#include <string.h>
static size_t max_len(const char * const data[], size_t size) {
size_t i = 0;
size_t max = strlen(data[0]);
for(i = 1; i < size; i++) {
size_t len = strlen(data[i]);
if(len > max) {
max = len;
}
}
return max;
}
int main(void) {
const char *const mystrings[] = {
"Fred", "Augustine", "Bob", "Lenny", "Ricardo"
};
size_t m = max_len(mystrings, 5);
size_t i;
for(i = 0; i < 5; i++) {
const char *item = mystrings[i];
size_t len = strlen(item);
size_t padding = 0;
/* +1 for padding byte */
if(len + 1 < m) {
padding = m - len;
}
printf("%s ", item);
size_t ii;
for(ii = 0; ii < padding; ii++) {
fputc(' ', stdout);
}
printf("%zu\n", i);
}
return 0;
}