2012-02-21 13 views
0

\ nなどの特殊文字をコマンドラインからCプログラムに取り込みたいと思います。C:コマンドラインの特殊文字を文字列に取り込む方法

たとえば、次のプログラムの場合、./a.out "\ nfoo \ n"を実行すると、 "\ nfoo \ n"の代わりに改行foo(改行)を印刷したいと思います。それを文字列に取り込むにはどうしたらいいですか?

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

int main(int argc, char ** argv){ 
    if(argc >1){ 
     char * s = strdup(argv[1]); 
     printf("%s\n", s); 
     free(s); 
    } 
    return 0; 
} 

編集:申し訳ありませんが、(改行)のfoo(改行)によって、私は意味acutal出力が

fooの

は現在、出力が "\ NABCの\ n" は、文字通りです(改行。 sは '\ n'文字の代わりに2文字をキャプチャするため、印刷されません)。混乱をおかけして申し訳ありません。

答えて

2

新しい文字列を作成し、新しい文字列に文字を追加する古い文字列を繰り返します。 '\'文字が見える場合は、古い文字列の次の文字に基づいて新しい文字列に特殊文字を追加します。

+0

はい。明確にするために、それを行うライブラリ関数はないので、あなた自身でそれを行う必要があります。たとえば、文字列に\とtを見つけたら、タブのcharを出力します。そういうもの;あなたはそれを綴る必要があります。 –

1

Cの文字列は動的に拡張できないため、新しい文字列にスペースを割り当て、目的の内容で入力する必要があります。しかし、いくつの文字が必要かを知るには、*sを最初に渡してカウントしなければなりません。必要な文字数を数えたら、mallocスペースを新しい文字列にして、古い文字列を繰り返して文字をコピーすることができます。あなたの "特別な"文字のいずれかが発生するたびに、適切な置換文字列を新しい文字列にコピーします。

いくつかのコードのスケッチ(テストしていない、あなたは、このいずれかを使用したい場合は、あなた自身をテストし、デバッグする必要があります):

char* replacement(char c) { 
    if(c == '\n') 
    return "(newline)"; 
    else if(c == '\t') 
    return "(tab)"; 
    else 
    return NULL; 
} 

int charactersNeeded(char* s) { 
    int count = 0; 
    char* r; 
    while(*s != '\0') { 
    r = replacement(*s); 
    if(r != NULL) 
     count += strlen(r); 
    else 
     count++; 
    s++; 
    } 
    return count; 
} 

void copyString(char* s, char* t) { 
    /* it is assumed that t points to a buffer of sufficient length 
    to hold all the copied chars, as well as terminating null */ 
    char* r; 
    do { 
    r = replacement(*s); 
    if(r != NULL) { 
     strcpy(t, d); 
     t += strlen(d)-1; 
    } else *t = *s; 
    s++; 
    t++; 
    } while(*s != '\0'); 
} 
+0

ご迷惑をおかけして申し訳ございません。問題は、プログラムが「\ n」文字の代わりに2文字で「\ n」をキャプチャすることです。 – user775614

+0

私は参照してください。あなたがする必要があることはまだ似ています。最初に必要な文字の数を数え、スペースを割り当ててからコピーします。 charsをコピーしているときに、バックスラッシュが発生したときには 's'を1進めて検索したcharを使ってルックアップテーブルに入れたり、上記の' replacement'と同様の関数を使います(ただし戻り値は ' char')。 –