0

コマンドラインで2つ以上6つ以下の引数を受け入れ、1番目または2番目の文字を出力するプログラムを作成する必要があります。例:asdf asdf asdf asdfは次のように出力します:asas

配列の初期設定と動作があります。以下のforループは、入力のスペースで文字列を切り取り、新しい文字列にコピーすることを目的としていますが、正しく動作していません。私はCとこのサイトに不慣れです。どんな助けでも大歓迎です。

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

int main(){

char a[50];
char b[50];
char c[50];
char d[50];
char e[50];
char f[50];

int i;

printf("enter a string (Ex: asdf asdf asdf... Must have atleast 2 arguments but no more than six): ");
scanf("%s", a);
printf("%c", a);

for (i = 0; i != 50; i++){

      if(a[i]==' '){
      char strncpy(b, &a[i], i+2);
      printf("\n%c ",a[1]);
      printf("%c ",b[0]);
      }
}
for (i = 0; i != 50; i++){    
      if(b[i]==' '){
      char strncpy(c, &b[i], i+2);
      printf("%c ",c[1]);
      }
}
for (i = 0; i != 50; i++){    
      if(c[i]==' '){
      char strncpy(d, &c[i], i+2);
      printf("%c ",d[0]);
      }
}
for (i = 0; i != 50; i++){    
      if(d[i]==' '){
      char strncpy(e, &d[i], i+2);
      printf("%c ",e[1]);
      }
}
for (i = 0; i != 50; i++){    
      if(e[i]==' '){
      char strncpy(f, &e[i], i+2);
      printf("%c ",f[0]);
      }
}
return 0;
}
4

1 に答える 1

0

文字列をどこからでもコピーする必要はありません...コマンドラインから取得すると、文字列を配置できますargv

int main( int argc, char **argv )
{

}

ここargcで、は引数の総数に1を加えたもの(最初はプログラムを呼び出した名前)であり、argvは各引数文字列へのポインターの配列です。これらは、コマンドラインからすでにトークン化されています。

したがって、最初に、十分な引数があることをテストします。比較から1つずつ混乱を取り除くために、新しい変数を明示的に作成するのが好きです。

int nparams = argc - 1;
if( nparams < 2 || nparams > 6 ) {
    printf( "Wrong number of arguments\n" );
    return -1;
}

次に、引数をループします。最初の文字は配列の位置1になります...あなたの例から、最初の引数の最初の文字と次の引数の2番目の文字を印刷してから、交互に続けているようです。これはモジュロ演算です。which印刷する文字を選択する変数があります。

int i, which;
for( i = 1; i <= nparams; i++ ) {
    which = (i-1) % 2;
    printf( "%c\n", argv[i][which] );
}

これは、1つおきの引数が少なくとも2文字の長さであることを前提としています。エラーチェックはありません。エラーチェックが必要な場合は、印刷する文字が文字列ターミネータ(値0)でないことを確認する必要があります。2番目の文字の場合も、0でない前に値を確認する必要があります。長さがゼロの文字列である引数を指定できるかどうかはわかりません。おそらく、知っている読者はコメントすることができます。

まあ、私はそれを入れたほうがいいかもしれません...それであなたのループは少しこのようになります:

if( argv[i][0] == 0 || argv[i][which] == 0 ) {
    printf( "\n" );
} else {
    printf( "%c\n", argv[i][which] );
}
于 2012-09-18T23:39:31.933 に答える