凯撒密码的C程序 - 格式%我预计类型为int *的说法,但有int类型

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


int main(int argc, const char *argv[])
{

argc++;

int number;

printf("Enter word you would like encoded\n");

scanf ("%s %i", argv[0], atoi(&argv[1]));

printf("%s", argv[1]);


int len = strlen(argv[1]);

for (int i = 0; i < len; i++)
{
    char offsetWord;

    offsetWord = atoi(argv[i])+len;

    putchar(offsetWord);
}

putchar('\n');

return 0;
}

我试图做的是从Linux命令行编译一个C凯撒密码的程序。要求:

1)K / Ratn的

ABCDEF

nopqrs)

2)./rotn狗

戈尔Zvpeix Objee已经Hzkv熊戈尔Inml球。

3)通过“rotn”写入文件。

./rotn狗狐狸

$猫的狐狸

戈尔Zvpeix Objee已经Hzkv熊戈尔Inml球。

4)用各种位移./rotn -8狗

BPM ycqks jzwev野联rcuxa月神wdmz tihg LWO。

这是据我已经得到了。我已经陷入了编译错误。我在现在的一个是“警告格式%我预计类型为int *的说法,但论据3为int类型。

有什么建议么?

c rotation atoi caesar-cipher
1个回答
1
投票

正如评论所指出的,你已经混了几件事情:

  • argcargv是传递到被调用时程序的参数。总有至少有一个参数,argv[0],节目的名称。你应该使用这些信息来分析您的命令行。
  • scanf扫描从stdin格式化输入。你并不真的需要格式化输入这里,你可以阅读fgets一整行,也可以读取fgetc单个字符。您存储在新的变数扫描数据;不要重复argv了点。

该解释你的命令行程序可能是这样的:

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

int main(int argc, const char *argv[])
{
    int shift = 13;                 // default shift
    const char *infile = NULL;      // default is stdin
    const char *outfile = NULL;     // default is stdout
    int i = 1;

    if (i < argc && argv[i][0] == '-') {
        shift = atoi(&argv[i][1]);
        if (shift <= 0) {
            fprintf(stderr, "Illegal shift.\n");
            exit(1);
        }
        i++;
    }

    if (i < argc) {
        infile = argv[i];
        i++;
    }

    if (i < argc) {
        outfile = argv[i];
        i++;
    }

    if (i < argc) {
        fprintf(stderr, "Illegal extra argument.\n");
        exit(1);
    }

    printf("shift: %d\n", shift);
    if (infile) printf("infile: %s\n", infile);
    if (outfile) printf("outfile: %s\n", outfile);

    // now use this inforation in your program

    return 0;
}

当然,你仍然必须实现编码器本身。下面是一些提示:

  • stdin是一个有效的文件句柄,因此您可以使用,如果用户没有指定文件名或把手从fopen(infile, "r")否则返回。您可以测试用户是否指定用if (infile) ...记得关闭时,它不stdin的文件,但文件名。
  • 同样的逻辑也可以用于输出文件,除了你必须以写入模式打开"w"文件,您应该使用fprintffputc
© www.soinside.com 2019 - 2024. All rights reserved.