gpt4 book ai didi

完全证明文件中的文本的 C 程序

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:00 25 4
gpt4 key购买 nike

这是我的问题陈述:

enter image description here

我有一个与部分代码相关的小问题,我找不到合适的解决方案。同样,我不一定要寻求完整的解决方案,我只是遇到了死胡同。我需要从文件行中读取(不知道它们的长度)找到一行的最大长度并在每行的单词之间均匀地添加空格,以便它们完全对齐(所有行的大小与最大长度相同一个)。

到目前为止,这是我的代码:

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

int main() {
FILE *f;
char *word;
int j, i, m, n, c, k, z;
char aux[255] = "", aux1[255];
i = 0;
j = 0;
char file[100][100];
char s[100];
f = fopen("user_input.txt", "r");
m = 0;

while (fgets(file[i], sizeof(file[i]), f)) {
if (m < strlen(file[i]) - 1)
m = strlen(file[i]) - 1;
i++;
}

for (j = 0; j < i; j++) {
n = 0;

for (k = 0; k < strlen(file[j]); k++)
if (file[j][k] == ' ')
n++;

c = (m - strlen(file[j])) / n;

for (z = 0; z < c; z++)
aux[z] = ' ';

for (k = 0; k < strlen(file[j]); k++)
if (file[j][k] == ' ') {
strcpy(aux1, file[j] + k + 1);
strcat(file[j], aux);
strcat(file[j], aux1);
}

printf("%s", file[j]);
}
}

最佳答案

您的代码因多种原因而损坏:

  • 你忘了包括<string.h>
  • 您对最大行长度和行数有硬编码限制,这两者都会导致 0.5p 的惩罚
  • 您不测试 fopen()成功,在打开文件失败时导致未定义的行为。
  • 您在读取行时不测试数组边界,如果文件超过 100 行或超过 99 字节的片段,则会导致未定义的行为。
  • 你对 c = (m - strlen(file[j])) / n; 的计算向下舍入。在许多情况下,您不会插入足够的空格来对全文进行调整。
  • aux没有正确地以 null 终止,它将不断增长,直到为任何给定行插入最大数量的空格。
  • 插入操作会破坏行并最终只留下最后一个单词,之前插入了一些空格。
  • 代码格式错误,因为您没有使用 {}对于非平凡的陈述,很难阅读,也很容易被破解。

这是一个没有这些限制的修改版本:

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

int main() {
const char *filename = "user_input.txt";
FILE *f;
char *line;
int c, i, len, maxlen, skip, nw, spaces, ns;

/* open the file */
if ((f = fopen(filename, "r")) == NULL) {
fprintf(stderr, "cannot open %s\n", filename);
return 1;
}

/* first pass: determine the maximum line length */
for (maxlen = len = 0;;) {
c = getc(f);
if (c == '\n' || c == EOF) {
if (maxlen < len)
maxlen = len;
len = 0;
if (c == EOF)
break;
} else {
len++;
}
}

/* allocate the line buffer: maxlen characters plus newline plus '\0' */
if ((line = malloc(maxlen + 2)) == NULL) {
fprintf(stderr, "cannot allocate memory for %d bytes\n", maxlen + 2);
fclose(f);
return 1;
}

/* second pass: read one line at a time */
rewind(f);
while (fgets(line, maxlen + 2, f)) {
len = strlen(line);
if (len > 0 && line[len - 1] == '\n') {
/* strip the newline if any */
line[--len] = '\0';
}
/* skip and output initial spaces */
for (skip = 0; line[skip] == ' '; skip++) {
putchar(line[skip]);
}
/* count the words */
for (nw = 0, i = skip; i < len; i++) {
if (line[i] == ' ')
nw++;
}
/* output the text, expanding spaces */
spaces = maxlen - len;
for (i = skip; i < len; i++) {
if (line[i] == ' ') {
ns = spaces / nw;
printf("%*s", ns, "");
spaces -= ns;
nw--;
}
putchar(line[i]);
}
putchar('\n');
}
free(line);
fclose(f);
return 0;
}

关于完全证明文件中的文本的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822633/

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