凯撒密码 C 程序 - 格式 %i 需要 int * 类型的参数,但具有 int 类型

标签 c rotation atoi caesar-cipher

#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) ./rotn

abcdef

nopqrs)

2) ./烂狗

Gur dhvpx oebja sbk whzcf bire gur ynml qbt。

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

./腐狗狐狸

$猫狐狸

Gur dhvpx oebja sbk whzcf bire gur ynml qbt。

4) 使用不同的类次 ./rotn -8 狗

Bpm ycqks jzwev nwf rcuxa wdmz bpm tihg lwo。

这是我目前所知的。我一直被编译错误所困扰。我现在遇到的问题是“警告格式 %i 需要 int * 类型的参数,但参数 3 的类型为 int。

有什么建议吗?

最佳答案

正如评论中已经指出的,您混淆了一些事情:

  • 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

关于凯撒密码 C 程序 - 格式 %i 需要 int * 类型的参数,但具有 int 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873739/

相关文章:

Javascript 更改外部 css 表中的关键帧值(无内联样式更改!)

java - 旋转 JLabel 并读取旋转值

c - atoi 似乎不适用于我的程序

C 获取字符串输入,并将其部分转换为整数

c - 我在 Visual Studio 2010 中尝试执行链接列表代码时遇到未处理的异常

c++ - 动态库没有静态库文件的符号

c# - EmguCV 旋转算法不起作用

c - `atoi` 这个名字是从哪里来的?

c - 使用更多内存会降低性能吗?

代码未正确评估峰值