2017-09-20 5 views
-3
#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(int argc, char *argv[]) 
{ 
    char str[1000], ch[100]; 
    int i, frequency = 0; 
    strcpy(argv[1],str); 
    strcpy(argv[2], ch); 
    for(i = 0; str[i]!= '\0'; ++i) 
    { 
     if(ch[i] == str[i]) 
      ++frequency; 
    } 
    printf("Frequency of %c = %d", *ch, frequency); 
    return (0); 
} 

コンパイルが成功しました。Cのコマンドラインからの文字列または文字の入力

入力:こんにちはH 出力は次のとおりです。= 2

+0

あなたのコードをC教科書のサンプルと正確に正確にフォーマットしてください。 –

+0

質問を入力してどのような出力が期待されているかを教えてください。いくつかの例を示してください。 –

+0

ようこそスタックオーバーフロー!あなたの質問を編集して、どのようなデバッグを行ったのか教えてください。私はValgrindまたは類似のチェッカー内であなたの[mcve]を実行し、たとえばGDBなどのデバッガーで調査したと思います。完全なコンパイラ警告を有効にしたことを確認してください。ツールはあなたに何を伝えましたか、どの情報が欠落していますか? Eric Lippertの[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んでください。 –

答えて

0

操作のために文字列全体を別の文字列にコピーする必要はありません。

#include <stdio.h> 

int main (int argc,char *argv[]) 
{ 
    if(argc==3) 
    { 
     int i, frequency = 0; 
     for(i = 0; argv[1][i]!= '\0'; ++i) 
     { 
      if(argv[1][i] == argv[2][0]) 
       ++frequency; 
     } 
     printf("Frequency of %c = %d", argv[2][0], frequency); 

    } 
    else 
     printf("Invalid no of inputs\n"); 
    return 0; 
} 

入力:

hello h 

出力:指摘

Frequency of h = 1 
3

Somegarbageの頻度あなたは間違った方向にコピーしている、プロトタイプは

char * strcpy(char *destination, const char *source); 

これは非常に可能性未定義の動作です。

また、文字列をコピーする必要はありません。他の文字列と同様に引数を処理できます。

+0

申し訳ありませんが、私はコマンドライン引数を初めて使っています。コマンドラインで入力する方法を教えてください。私はatoi()関数を整数として使用しますが、ユーザ定義の文字列やchar入力をコマンドラインから与えることができません。ありがとうございます –

+0

無効な入力に対する動作が信頼できないため、 'atoi'は使用しないでください。 'strtol'を使います。 –

+1

@PranavKarakavalasa新しい実際の質問を投稿してください。このサイトの仕組みとはまったく異なる何かをフォローアップするためのコメントを使用してください。 – unwind

0

strcpyファンクションは、第2引数の値を第1引数にコピーします。コマンドライン引数から値(一文字)を使用またはアクセスしたい場合は、2次元配列のようにします。

argv[1][0] 

私はあなたがコマンドライン引数をよく理解していないと思っています。コマンドラインでは、数字、文字、または文字列を入力するわけではありません。常に文字列として読み込まれます。 Uは、

./file-name 123 a myfile 3.14 

として実行するいくつかのコマンドを持っている場合、したがってすべて上記のようにアクセスされます次の

agrvを[1]"123"を有する文字列です。最初の文字('1')のみにアクセスするには、argv 1 [0]と書きます。

agrv [2]は、"a"の文字列です。最初の文字('a')のみにアクセスするには、argv 1 [0]と書きます。

agrv [3]は、"myfile"の文字列です。最初の文字('m')のみにアクセスするには、argv [3] [0]と書きます。

agrv [4]は、"3.14"の文字列です。最初の文字('3')のみにアクセスするには、argv [4] [0]と書きます。

コマンドライン引数の詳細については、hereを参照してください。

0

unwindとして、あなたは間違った方向にstrcpy()でコピーしています。右から左へ:

strcpy(argv[1],str); 
strcpy(argv[2], ch); 

は、これは私が私の先生が教えてくれた方法です

strcpy(str, argv[1]); 
strcpy(ch, argv[2]); 

に変更する必要があります。 Usain Boltが彼の有名人をポーズするときのポイントのようにvictory pose。彼の右手は左を指しています。

strncpy()

代わりstrcpy()のオーバーフローを回避するために使用することができるが、ソースが長く指定されたサイズよりも大きい場合、\0strncpy()によって宛先列に付加されていません。

文字列と文字をコマンドラインで入力し、その文字列内のその文字の出現回数を調べようとしているようです。その場合は

は、argv[1]を想定すると、文字列を持っており、argv[2]は、文字、 単一の文字ではありませんargv[2]場合、エラーメッセージが表示されることがあります。

if(strlen(argv[2])!=1) 
{ 
    printf("\nError"); 
    exit(1); 
} 

また、(プログラム名以外の)提供された引数の数は、例えば、少なくとも2である場合にのみ、1引数を指定して、argv[2]を使用しようとしている場合、それはエラーにつながるチェックする必要があります。

if(argc<3) 
{ 
    printf("\nNo enough arguments"); 
} 

プログラム名は、の値でカウントされます。 ch[0]代わりのcを使用すると、同様に動作するはずですhere

char c=ch[0]; 
for(i = 0; str[i]!= '\0'; ++i) 
{ 
    if(c == str[i]) 
     ++frequency; 
} 
printf("Frequency of %c = %d", c, frequency); 

を参照してください。

+0

"strncpy()はオーバーフローを避けるために使用できます"また、宛先がヌル文字で終了する文字列であることを保証しません。適切な使用の詳細が示されていない限り、助言は得策ではありません。 – chux

+0

@chux私はそれを知らなかった。しかし、今、あなたに感謝します。編集されました。 –

関連する問題