我需要创建一个程序来读取扩展名为“ .deck”的文件。也就是说,程序参数应为-d1 <name>.deck
。必须始终写入-d1
字符串,并且必须强制使用.deck
扩展名,<name>
可以是具有任何给定长度的任何给定字符串。 .deck
文件基本上是带有扑克牌的文本文件。
谢谢:)
答案 0 :(得分:0)
因此,您要做的是,首先从"-d1 *"
变量中提取整个**argv
字符串。为此,只需循环**argv
并检查其前四个字符是否为"-d1 "
。之后,将其复制到一个字符串,例如s
,并删除s
结尾处的所有空白区域。为此,请使用while循环。最后检查s
中的最后5个字符是否为".deck"
。
(伪代码)
target="-d1 ";
loop i from 0 to argc-1{
flag=true;
loop j from 0 to 3{
if (argv[i][j]!=target[j]){
flag=false;
break;
}
}
if (flag){
break;
}
}
if (!flag){
/* ERROR - NO "-d1" ARGUMENT */
}
str=copy(argv[i]);
len=length(str)-1;
while (len>0)&&(str[len]==' '){
len--;
}
if (len<6){
/* ERROR - THE STRING IS CERTAINLY INVALID */
}
flag=true;
target="kced."; /* reverse of ".deck" */
loop i from 0 to 4{
if (str[len-i]!=target[i]){
flag=false;
}
}
if (!flag){
/* ERROR - FILENAME IS INVALID */
}
/* proceed */
答案 1 :(得分:0)
这可能就是您想要的。
当前,以下程序在所有命令行参数上循环并搜索-d1
标志。找到后,它会确保存在下一个参数,即在尝试打开它之前是扩展名为.deck的字符串。
请注意,该程序不会处理多个文件。
您将需要实现某种类型的链接列表或数组,以存储多个fds
或字符串。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static const char *FLAG = "-d1";
static const char *EXTENSION = ".deck";
int is_deck_file(char const *string)
{
int length = strlen(string);
if (length < 6)
return 0;
if (strcmp(string + (length - 5), EXTENSION) == 0)
return 1;
return 0;
}
int main(int argc, char const *argv[])
{
int fd = -2;
for (unsigned int i = 0; i < argc; i++) {
if (strcmp(argv[i], FLAG) == 0) {
if (i + 1 < argc && is_deck_file(argv[i + 1])) {
i++;
fd = open(argv[i], O_RDONLY);
} else {
dprintf(2, "Error: %s flag must be followed by a filepath.\n", FLAG);
}
}
}
if (fd == -2)
dprintf(2, "No file was provided.\n");
else if (fd == -1)
dprintf(2, "Unable to open file.\n");
else
dprintf(1, "File provided, with right extension!\n");
}