0

私は最初のCプログラムに取り組んでいます。このプログラムでは、文字列を自由に作成および分解する必要があります。しかし、それを正しく行う方法はわかりません。誰か説明してもらえますか?

これが私がそれを得る限りの私のコードです:

int main( int argc, char ** argv ) 
{ 
    if ( argc != 2 ) 
    { 
        _print_help(); /* defined above main() */ 
        exit(0); 
    } 

    char *s = argv[1]; 
    char *val = ""; 
    register int i; /* no idea why I need "register" and not just int */
    for(i=0;s[i];++i) /* loop over the string, take each character 
    {                    and add it to another string */
        strcat(val,s[i]); 
        printf("v:%s;\n",val); 
    } 
    printf("expression: %s\n",s); 
}

gccは(autotoolsで生成された)makeファイルから呼び出されます:

gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT c-calc.o -MD -MP -MF .deps/c-calc.Tpo -c -o c-calc.o c-calc.c

そして今、strcatへの2番目の入力として整数を入れてはいけないという警告がスローされます。また、string3.hはconst char * __restrict__単なるaではなく期待していますchar(Ubuntuはドイツ語で私に話しかけるので、それらを翻訳する必要があります)。コンパイルされたプログラムをアクティブにすると、がスローされ、プログラムはセグメンテーション違反を意味するように見えるMemoryaccess errorコードで戻ります。139

4

1 に答える 1

3

最初のプログラムには非常に良いです;)最初に私はあなたが望むことをするプログラムを書き、それからそれをもう少し説明します。

int main( int argc, char ** argv ) 
{ 
    if ( argc != 2 ) 
    { 
        _print_help(); /* defined above main() */ 
        exit(0); 
    } 

    char *first_arg = argv[ 1 ] ;
    char val[ 1024 ]; //You should make enough memory to hold all the strings concatenated to each other. Here we suppose that 1024 is enough.

    strcpy( val , "" ) ; //Since val is an accumulator it should be initialized first.

    for( int i = 0 ; i < strlen( first_arg ) ; i++ ) /* loop over the string, take each character and add it to another string */
    {
        char char_str[ 2 ] ;
        char_str[ 0 ] = first_arg[ i ] ;
        char_str[ 1 ] = '\0' ;

        strcat( val , char_str ) ; 
        printf( "v:%s;\n" , val ) ; 
    }

    printf( "expression: %s\n" , val ) ; 
}

OK、もっとよく説明しましょう。まず、ポインタが何であるかを知っておく必要があります。ポインタは、メモリ(通常はヒープメモリ)内の場所を指す単なる数値です。あなたが定義するとき、char *valそれは単なるポインタであり、その背後には何も割り当てられていません。初期化するには、次のコマンドを使用する必要があります。

char val[ 1024 ] ;
char *val = new char[ 1024 ] ;

これらのコマンドは異なります。実際、最初のコマンドは、スタックから必要なメモリ(1024バイト)を割り当てます。ただし、前者はヒープメモリから1024バイトを取得します。前者は、含まれているブロックを離れると解放されるため、解放される必要はありません。ただし、2番目のコマンドは、プログラマーが次のコマンドを使用して手動で解放する必要があります。

delete [] val ;

これらの行について:

char char_str[ 2 ] ;
char_str[ 0 ] = first_arg[ i ] ;
char_str[ 1 ] = '\0' ;

first_argはを指すポインタですargv[ 1 ]。これは、同じアドレスを保持していることを意味します。文字はC/C++の文字列とは異なります。'A'とは異なり"A"ます。C / C ++のすべての文字列は、文字で終わる必要があり'\0'ます。最初はで、2番目はである2文字の文字列"A"として見ることができます。また、strcat()メソッドは常に2つの文字列を連結するため、文字列を作成する必要がありました。2つのセルを持つキャラクターで、最初のキャラクターは希望のキャラクターで、次のキャラクターはキャラクターです。これで、この文字列を使用してvalに追加できます。'A''\0''\0'

于 2012-06-09T22:32:39.310 に答える