【问题标题】:Formatting printf and extra string print?格式化 printf 和额外的字符串打印?
【发布时间】:2013-03-02 04:15:51
【问题描述】:

我有 2 个问题,第一个是,我无法让我的行在我的数组的打印中匹配。我只能拿到第一行来匹配!

void printStructs(struct student *list, int size){

int j = 0;

printf("Last Name, First Name            Term      ID      Course   Section\n");
printf("-------------------------------- ----  ---------   ------   -------\n");

while(j < size){

    printf("%s, %-21s %-5d %-11d %s%d %7s\n", list[j].lastname, list[j].firstname, list[j].term, list[j].id, list[j].subjectname,list[j].catalog, list[j].section);

    j++;

}
}

这为我提供了这个的输出!

看看只有第一个是如何正确排列的?我如何让剩余的行来做到这一点!?

现在我的第二个问题是我根本看不到的问题。注意到在显示姓氏之前的倒数第二行中多余的“Susan”吗?这是哪里来的!?它适用于所有其他名称,我在这里没有看到什么?

编辑:这里找不到涉及额外名称的错误!刚刚意识到这与我将名称初始化为该值的循环有关,如果我无法弄清楚,将进一步编辑,现在忽略!

EDIT2“额外字符串问题!”:

好的,所以我已经缩小了问题所在,但不完全是为什么会发生,我相信它与分隔符有关...这里是代码

studentsRead = readStudentList(inputf, students, N);

printf("%s\n", students[6].lastname);

printStructs(students, studentsRead);

/*for (j = 1 ; j <= 10-1 ; j++){

    for(k = 0 ; k <= 10-2 ; k++){

        if(students[k] > students[k+1]){

            temp = students[k];
            students[k] = students[k+1];
            students[k+1] = temp;

            }
        }
    }*/

fclose(inputf);

return 0;

 }

int readStudentList(FILE *f, struct student *list, int maxSize){

char buff[65];
int count = 0;

while((count < maxSize) && (fgets(buff, sizeof(buff), f) != NULL)){

    struct student item;

    if(parseStudent(&item, buff)){

        list[count++] = item;

    }
}

return count;

}

int parseStudent(struct student *person, char *data){

char *ptr;

int i = 0;

ptr = strtok(data, DELIM);

person[i].term = atoi(ptr);

ptr = strtok(NULL, DELIM);

person[i].id = atoi(ptr);

ptr = strtok(NULL, DELIM);

strcpy(person[i].lastname, ptr);

printf("%s\n", person[i].lastname);

ptr = strtok(NULL, DELIM);

strcpy(person[i].firstname, ptr);

ptr = strtok(NULL, DELIM);

strcpy(person[i].subjectname, ptr);

ptr = strtok(NULL, DELIM);

person[i].catalog = atoi(ptr);

ptr = strtok(NULL, DELIM);

strcpy(person[i].section, ptr);

}

通过这段代码,一切正常打印,直到我调用 readStudentList 之后的 printf,它打印出姓氏,名字 String 卡在最后。尽管在我的解析函数中打印了姓氏似乎正常显示?我一直在尝试将打印输出放在整个地方,看看哪里出了问题,但其中一些甚至不会打印任何东西?

【问题讨论】:

  • 我几乎看不懂你的输出。裁剪后的大图会比这更好:-)
  • @Aniket:使用大多数当前浏览器,您应该能够右键单击图片并在新选项卡(或新窗口)中打开它,然后您可以查看全尺寸。
  • 计算你姓氏中的字母并将其与列偏移量相匹配,你会看到对齐情况。您想要组合名称的单一宽度限制,这意味着单独构建组合。

标签: c formatting printf


【解决方案1】:

问题是您打印姓氏时只使用%s 而不是指定宽度。这意味着该行的其余部分会根据名字的长度向左或向右移动。

至于你应该如何格式化,你可能想首先将名字和姓氏连接在一起,然后以固定宽度打印结果:

char buffer[256];

sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

printf("%-32s ...", buffer, ...);

我的猜测是重名问题源于读取数据不正确;似乎不在您显示的代码中。

【讨论】:

  • 是的,我现在有点难以理解我的代码是如何到达那里的,如果再扫描几次后我看不到它,我会对其进行编辑!还!谢谢!
  • 无论如何要摆脱空格?我把所有东西都排好了,但是逗号都在姓氏的右边,但是排好了
  • 大声哇,多么聪明的解决方法,没想到,谢谢!
【解决方案2】:

问题在于printf%s,您必须对last namefirst name 使用单一格式说明符。所以 concatenate last namefirst name 在单独的缓冲区中并在 printf 中使用该缓冲区。

【讨论】:

    【解决方案3】:

    printf ("%d %.s", 数字, SIZE, 字母);
    注意:宽度(即最小字段宽度)和精度(给出要打印的最大字符数)之间存在区别。 %s 指定宽度,%.s 指定精度。 (你也可以使用%。但是你需要两个参数,一个是宽度,一个是精度)

    【讨论】:

    • 现在只需给出您的名字和姓氏的最大长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2016-06-21
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多