私は入力行を取り、コマンドライン引数のような入力行を解析するプログラムを書いていますが、これは通常のコマンドラインプログラムによって解析されます。私はchar * args []と呼ばれる変数を使用して、解析された文字列、構文解析、および変数を、char * argv []で使用される通常のコマンドラインプログラムとよく似ています。私はこのプログラムを使って作業していましたが、引数をループしても、それぞれをchar * args []に追加しても、最終的な結果は変数char * args []に格納される最後の "引数"その配列。ここで char * array []文字列配列を使用する正しい方法は何ですか?
は、コードの...ここで#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int bool;
#define true 1
#define false 0
int main(int argc, char *argv[])
{
char input[200];
printf(">");
gets(input);
int i=0;
int t=0;
int l=0;
bool space=false;
char arr[50];
char *str;
char *args[10];
memset(&arr,0,sizeof(arr));
memset(&str,0,sizeof(str));
memset(&args,0,sizeof(args));
for(i;i<sizeof(input);i++)
{
printf("l=%d,t=%d\n",l,t);
if(input[i]=='\0')
break;
if(input[i]==' ')
{
if(!space)
{
printf("arr : %s...\n",arr);
str=arr;
printf("str : %s...\n",str);
args[l]=str;
printf("args[%d] : %s...\n",l,args[l]);
memset(&arr,0,sizeof(arr));
memset(&str,0,sizeof(str));
t=0;
l++;
space=true;
}
}
else
{
arr[t]=input[i];
space=false;
t++;
}
}
printf("arr : %s...\n",arr);
str=arr;
printf("str : %s...\n",str);
args[l]=str;
printf("args[%d] : %s...\n",l,args[l]);
printf("\n");
//Shows that all of char *args[] is the last string to be set...
int j=0;
for(j;j<=l;j++)
{
printf("args[%d] = %s...\n",j,args[j]);
}
//hello and goodbye are set and output below like a normal char *args[]
//array should...
args[0] = "hello";
args[1] = "goodbye";
j=0;
for(j;j<=l;j++)
{
printf("args[%d] = %s...\n",j,args[j]);
}
return 0;
}
は、いくつかのサンプル出力...
C:\Users\Auguest\Desktop>basecalc.exe
>asdf hsdf ewrr ewr
l=0,t=0
l=0,t=1
l=0,t=2
l=0,t=3
l=0,t=4
arr : asdf...
str : asdf...
args[0] : asdf...
l=1,t=0
l=1,t=1
l=1,t=2
l=1,t=3
l=1,t=4
arr : hsdf...
str : hsdf...
args[1] : hsdf...
l=2,t=0
l=2,t=1
l=2,t=2
l=2,t=3
l=2,t=4
arr : ewrr...
str : ewrr...
args[2] : ewrr...
l=3,t=0
l=3,t=1
l=3,t=2
l=3,t=3
arr : ewr...
str : ewr...
args[3] : ewr...
args[0] = ewr...
args[1] = ewr...
args[2] = ewr...
args[3] = ewr...
args[0] = hello...
args[1] = goodbye...
args[2] = ewr...
args[3] = ewr...
C:\Users\August\Desktop>
私はWindows XP上のMinGWのgcc 4.9.3を使用していますが...ある
私はchar * args []を正しく使用していないと感じています。この配列をループして各エントリに値を割り当てる正しい方法は何ですか? char * args []を一般的に使用する正しい方法は何ですか?私のプログラムで何か他のものがあれば、そう言えば、インターネットが聞きたいと思います。引数の各エントリは、[]引数[においてので、ポインタSTRにエントリのすべてを設定されている
if(!space)
{
printf("arr : %s...\n",arr);
str=arr;
printf("str : %s...\n",str);
args[l]=str;
printf("args[%d] : %s...\n",l,args[l]);
memset(&arr,0,sizeof(arr));
memset(&str,0,sizeof(str));
t=0;
l++;
space=true;
}
私はそれを考え出し
申し訳ありませんが、これは実際の混乱であり、迅速な回答よりも多くのTLCを使用します。私はCのポインタ、文字列、およびメモリの割り当てを読むことをお勧めします。また、sizeof()は静的なコンパイル時の演算子で、あなたの場合は常に200を返します。 strlen()を使うつもりだと思う。 – OldProgrammer
マイナーコメント: 'l'のような変数名は、多くのフォントで' 1'と非常によく似ているのですばらしいものではありません。 –
また、 'strtok()'のようなものを使って、文字列をパースすることもできます。 –