-3

10個のコマンドライン引数を取り、それらに対して特定のアクションを実行するプログラムをCで作成しようとしています。int main(int argc, char **argv)10 個の引数を受け入れる部分と、ユーザーが 10 個すべてを入力すると結果を出力する部分が既にありますprintf(" %s", argv[i]);

入力された各コマンドライン引数でアクション自体を実行する方法を理解しようとしています。つまり、次のとおりです。

  • などの特殊記号をすべて削除し(*&%^’$+_ます。
  • 文字以外をすべて削除

そして最後に:

  • 引数に 1 つ以上の数字が含まれる場合、最初の数字が n であると仮定して、その引数を n 番目の引数に置き換えます (唯一の例外は 0 で、10 番目の引数にマップする必要があります)。たとえば、入力された引数が の場合764、この引数は 7 番目の引数に置き換えられます。

編集:以下のより良い例で更新

入力例を次に示します (10 個のユーザー入力引数)。

sda 789 io90 poi 4kl24PP +df_1JK MN BV XC __5555

そして出力はどうあるべきか:

sda  MN  XC  poi  poi  sda  MN  BV  XC  klPP

(また、789 が MN である 7 番目の出力にどのようにマップされるかにも注意してください)

4

3 に答える 3

0

H2CO3 は私のものより少し小さいですが、ここで質問を簡単に実装します。

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

int main(int argc, char **argv) {
    char **original = argv + 1;
    char *messages[10] = {0};

    if (argc != 11) {
        printf("We expect 10 arguments.\n");
        return -1;
    }

    // Allocate space for the copied data.
    for (int i=0; i<10; ++i)
        messages[i] = calloc(sizeof(char), strlen(original[i]) + 1);

    // Let's parse out the parts of the mutable array that we don't want to keep.
    // So kill everything but letters
    for (int i=0; i<10; ++i) {
        int head = 0;
        int tail = 0;

        while (original[i][tail] != '\0') {
            if (isalpha(original[i][tail])) {
                messages[i][head] = original[i][tail];
                head++; tail++;
            } else {
                tail++;
            }
        }
    }

    // Now, let's parse each message, and see what we are supposed to print.
    for (int i=0; i<10; ++i) {
        char *pos = strpbrk(original[i], "0123456789");

        if (pos == NULL) {
            printf("%s ", messages[i]);

        } else {
            int index = *pos - '0';
            if (index == 0)
                index = 10;
            printf("%s ", messages[index - 1]);
        }
    }

    for (int i=0; i<10; ++i)
        free(messages[i]);

    printf("\n");
}
于 2013-05-06T13:15:32.967 に答える