【发布时间】:2020-06-07 21:25:35
【问题描述】:
我在下面有一个代码 sn-p。 在 macOS 上,我在 Xcode 和 CLion 中运行它,得到了同样奇怪的结果。 另一方面,在使用 gcc 编译的 Linux 上,它可以完美运行。 我想知道代码在任何时候是否会产生未定义的行为。 它试图解析的输入文件是 vigenére 表,你知道,有 26 个字符的行,带有拉丁字母,并且字母在下面的 1 行上左移 1。 每行都由 CRLF 终止。 预期的输出是控制台上打印的表格。 意想不到的部分是 az 至少 1 行在 macOS 上显示不正确。 这是输入顺便说一句: https://pastebin.com/QnucTAFs (但我不知道是否保留了相应的行尾)
#include <stdio.h>
#include <stdlib.h>
char ** parse(char *path) {
FILE *f = fopen(path, "r");
char **table = (char**)malloc(sizeof(char*) * 26);
int i = -1;
do table[++i] = (char*)malloc(sizeof(char) * 27);
while (fscanf(f, "%s", table[i]) > 0);
return table;
}
int main() {
char **table = parse("Vtabla.dat");
for (int i = 0; i < 26; i++) {
for (int x = 0; x < 26; x++)
printf("%c", table[i][x]);
printf("\n");
}
return 0;
}
【问题讨论】:
-
fclose(f);在parse函数中很好,如果文件中的行数超出您的预期,这看起来会爆炸。 -
这段代码从未编译过
-
@SteveFriedl 不能有更多行,因为字母表有 26 个字符长,即 Vigenère 表中的行数。
-
“不可能”是著名的遗言。在 C 中,您必须确保没有。
-
"无法使用 fgets 解析它" -->
char buf[80]; if (fgets(buf, sizeof buf, f)) { buf[strcspn(buf, "\n\r")] = 0; assert(strlen(buf) == 26); strcpy(table[i], buffer); }.
标签: c scanf newline undefined-behavior