我试图解决这个问题的CS50,但由于一些令人费解的原因,它甚至不会承认,我试图运行的文件,甚至存在时,我在正确的目录与上述文件。
的数据
#include <stdio.h>
int main(int argc, char *argv[])
{
// Check for command line args
if (argc != 2)
{
printf("Usage: ./read infile\n");
return 1;
}
// Create buffer to read into
char buffer[7];
// Create array to store plate numbers
char *plates[8];
FILE *infile = fopen(argv[1], "r");
int idx = 0;
while (fread(buffer, 1, 7, infile) == 7)
{
// Replace '\n' with '\0'
buffer[6] = '\0';
// Save plate number in array
plates[idx] = buffer;
idx++;
}
for (int i = 0; i < 8; i++)
{
printf("%s\n", plates[i]);
}
}
字符串
2条答案
按热度按时间5tmbdcev1#
license.c
是一个 * 源 * 文件,必须 * 编译 * 为 * 可执行 * 文件。license
与license.c
不同。用于将源文件转换为可执行文件的CS50工具称为
make
。例如,执行make foo
将导致程序查找名为foo.c
的源文件,并生成名为foo
的可执行文件,假设在编译(或链接)期间没有错误发生。这在Week 1 Lecture和其他各种地方(如Debug)中进行了描述。
总之,按顺序键入以下命令。
字符串
$
表示您正在将这些命令键入终端。关于你的节目:
infile
应测试为不是NULL
。如果是NULL
,程序应该提前退出,否则fread
将调用Undefined Behaviour。plates[idx] = buffer;
中,buffer
衰减为指向其第一个元素的指针,该指针值存储在plates
数组中。不存在缓冲区元素的复制或发生的自动存储器分配。实际上,您在plates
中重复存储对相同数组的引用。char plates[8][7];
)。对于前者,您需要将当前缓冲区的值(strcpy
/memcpy
)复制到新的内存分配中,而对于后者,您可以直接读取plates
。while
循环还应该在从文件阅读更多数据之前检查plates
是否未满。否则,当idx
大于或等于(>=
)到8时,您将通过在出界位置访问plates
来调用更多的Undefined Behaviour。bvpmtnay2#
使用以下命令将源文件编译为文件名为 license 的二进制文件。
字符串
o标志允许您指定输出文件名。如果不使用-o标志,将生成一个名为 a.out 的输出文件。
现在可以使用
./license
来执行代码。