如何从参数中读取多个字符

时间:2018-04-16 11:19:59

标签: c arguments atoi

我正在尝试从c中的参数中读取多个字符。所以,当这个人规则文件像" ./ amazing_program qwertyyuiopasdfghjklzxcvbnm"它将读取qwerty字符并将其作为数字(ASCII)存储到数组中,如:

array[0] = 'q';
array[1] = 'w';
array[2] = 'e';
array[3] = 'r';
array[4] = 't';
array[5] = 'y';
and so on...

我的目标:将参数分成每个单独的字符,并将每个字符存储到数组中的不同位置(如上所示)。

我试过这种方式,但它没有用。

int user_sub = 0;
int argument = 1;
while (argument < argc) {
   user_sub = atoi(argv[argument]);
   argument = argument + 1;
}

2 个答案:

答案 0 :(得分:1)

通过阅读您的评论,我已经明白您只是希望能够找到角色,这样您就可以进行转变。嗯,这并不难做到,所以我试图告诉你如何在这里完成它,而不必为你完成凯撒逻辑。

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

#define SHIFT   13

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

    // Verify they gave exactly one input string.
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <word>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    // A string IS already an array of characters. So shift then and output. 
    int n = strlen(argv[1]);
    for (int i = 0; i < n; i++) {
        char c = argv[1][i];

        // Shift logic here: putchar(...);
        printf("%d: %c\n", i, c);
    }

    return EXIT_SUCCESS;
}

关键点是字符串已经一个数组。您不需要制作新阵列并将所有字符粘贴在其中。你已经有一个。这个程序所做的只是简单地提取&#34;并为您打印它们,以便您可以看到这一点。它目前只将当前参数字符串写入输出,并且不会移位。那是你要做的。它也没有考虑非字母字符。你必须自己考虑一下。

答案 1 :(得分:0)

你严重缺乏:

1)

C中的字符串是char类型的 ARRAY 。我们知道数组的结尾在哪里感谢特殊值:&#39; \ 0&#39;。 现在,您必须深刻理解数组的每个案例都包含 NUMBER :因为案例的类型是char,它将是[-128,127]范围内的数字(是的,我知道char很特别,可以签名或不签名,但暂时让它变得简单。)

因此,如果您访问数组的每个案例并打印它,您将得到介于-128和127之间的数字。那么程序如何知道打印字母而不是数字?他怎么知道哪个号码的哪个号码?

感谢用于此uniq目的的内部表。最常见的是ASCII表。因此,如果数组的大小写为65,那么将打印的是&#39; A&#39;。

2)我如何查看字符串的每个案例? (这是一个由&#39; \ 0&#39;)终止的字符数组?

只需使用for循环。

char str[] = "test example";
for (size_t i = 0; str[i] != '\0'; ++i) {
  printf("The %d letter is  '%c'\n", i, str[i]);
}

同样,由于它是str[i]中的数字,该程序如何知道如何打印字母?感谢&#34;%c&#34;在printf中,意思是&#34;使用表格打印信件(可能是ASCII)&#34;。如果你使用&#34;%s&#34;,它是相同的,但你必须给出数组本身,而不是数组的情况。

那么,如果我想打印数字而不是字母怎么办?只需使用&#34;%d&#34;在printf。

char str[] = "test example";
for (size_t i = 0; str[i] != '\0'; ++i) {
  printf("The %d letter is  '%c' and it's real value is %d\n", i, str[i], str[i]);
}

现在,如果我们在字符串的每种情况下增加所有值,该怎么办?

char str[] = "test example";
for (size_t i = 0; str[i] != '\0'; ++i) {
  str[i] = str[i] + 1; // Or ++str[i];
}
for (size_t i = 0; str[i] != '\0'; ++i) {
  printf("The %d letter is  '%c' and it's real value is %d\n", i, str[i], str[i]);
}

我们更改了字符串&#34;测试示例&#34;进入&#34; uftu fybnqmf&#34;。

现在,对于您的问题,您必须逐步采取解决方案: 首先,创建一个函数,通过添加移位来改变(密码)参数中给出的字符串。

void CesarCypherString(char * string);

小心&#34;溢出&#34; !如果我想换班次5,那么&#39; a&#39;将成为&#39; f&#39;但是会发生什么?&#39; z&#39; ?它应该是&#39;。 但如果你看一下ascii表,&#39; a&#39; = 97,&#39; f&#39; = 102(这是有道理的,因为&#39; + 5 =&#39; f&#39; 97 + 5 = 102),但是&#39; z&#39;是122和&#39; e&#39;是101.所以你不能直接做&#39; z&#39; + 5 =&#39; e&#39;因为它错了。

提示:使用模运算符(%)。

接下来,当您完成函数CesarCypherString时,请执行将对字符串进行decypher的函数CesarDecypherString。

完成后,您可以专注于如何从argv读取/复制字符串。