while循环出错了但是我真的不明白为什么。它应该用参数(progname.exe -e input.txt)将文件的加密或解密结果打印到输出文件中
问题是没有使用加密或解密代码创建的输出文件
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int c;
FILE *fp;
FILE *output;
if (argc < 2) {
exit(EXIT_FAILURE);
} else if ((fp = fopen(argv[1], "r")) == NULL) {
exit(EXIT_FAILURE);
}
if (strncmp (argv[1], "-d", 2) == 0) {
output = fopen (argv[5], "w+");
while (fscanf(fp,"%x",&c) != EOF) {
c = c >> 2;
c = c-200;
printf("%c", c);
}
}
if (strncmp (argv[1], "-e", 2) == 0) {
output = fopen (argv[5], "w+");
while ((c = getc(fp)) != EOF) {
c = c+200;
c = c << 2;
printf("%04x ", c);
}
}
putchar('\n');
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
程序参数的顺序/数量似乎没有意义。
程序似乎期望输入文件是第一个参数(argv[1]
):
} else if ((fp = fopen(argv[1], "r")) == NULL) {
exit(EXIT_FAILURE);
}
如果第一个参数不是现有文件,程序将退出而不写任何输出。
稍后将相同的参数与"-d"
和"-e"
进行比较以检查解密/加密:
if (strncmp (argv[1], "-d", 2) == 0) {
可能你想在输入文件名argv[2]
之后使用程序参数?如果该参数不是-d
的{{1}},则程序不会写任何输出文件。
此外,第五个参数-e
被视为输出文件名。如果这不是有效的文件名,则也不会创建输出文件。
答案 1 :(得分:0)
代码中的问题主要是不正确使用命令行参数。
argc
包含参数计数,因此如果您有ls -a -l file
,那么argc
将包含值4
,您可以使用此信息解析内部的命令行参数程序使用switch
的情况很容易根据传递的参数数量,或者您可以查看命令行解析器库。
#include <unistd.h>
),它可以解决简单的参数解析任务,bash的getopt内置基于Getopt来自GNU libc。#include <argp.h>
)。以下是使用代码的开关案例
的示例它可以采用命令行参数行。
输出到文件:
prog.exe -e input.txt output.txt
prog.exe -d output.txt input2.txt
输出到标准输出:
prog.exe -e input.txt
prog.exe -d output.txt
对于其他参数,它将打印一个无效的参数错误并返回。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int c;
FILE *input = NULL;
FILE *output = NULL;
int encryption = 1; // Flag to set encryption/decryption.
switch ( argc ) {
case 3:
if ( strchr(argv[1],'-') != NULL ) {
if ( argv[1][1] == 'e' ) encryption = 1;
else if ( argv[1][1] == 'd' ) encryption = 0;
else {
fprintf(stderr,"Error: invalid Option %s\n",argv[1]);
exit(EXIT_FAILURE);
}
if ((input = fopen( argv[2], "r")) == NULL) {
fprintf(stderr,"Error: Cannot Open %s\n",argv[2]);
exit(EXIT_FAILURE);
}
output = stdout;
} else {
fprintf(stderr,"Error: Invalid arguments\n");
exit(EXIT_FAILURE);
}
break;
case 4:
if ( strchr(argv[1],'-') == NULL ||
strchr(argv[2],'-') != NULL ||
strchr(argv[3],'-') != NULL ) {
fprintf(stderr,"Error: invalid argument\n");
exit(EXIT_FAILURE);
} else {
if ( argv[1][1] == 'e' ) encryption = 1;
else if ( argv[1][1] == 'd' ) encryption = 0;
else {
fprintf(stderr,"Error: invalid Option %s\n",argv[1]);
exit(EXIT_FAILURE);
}
if ((input = fopen( argv[2], "r")) == NULL) {
fprintf(stderr,"Error: Cannot Open %s\n",argv[1]);
exit(EXIT_FAILURE);
}
if ((output = fopen( argv[3], "w+")) == NULL) {
fprintf(stderr,"Error: Cannot Open %s\n",argv[3]);
exit(EXIT_FAILURE);
}
}
break;
default:
fprintf(stderr,"Error: Invalid arguments\n");
exit(EXIT_FAILURE);
}
// Do encryption and decryption based on the flag.
if ( encryption ) {
while ( fscanf(input,"%c",(char*)&c) == 1 ) { // Do encryption
c = c + 200;
c = c << 2;
fprintf(output,"%x ", c);
}
} else {
while ( fscanf(input,"%x ",&c) == 1 ) { // Do decryption
c = c >> 2;
c = c - 200;
fprintf(output,"%c", c);
}
}
return EXIT_SUCCESS;
}