0

文字ポインタについて質問があります。

私が持っているとしましょう:

char * x = malloc(len);

上記もNULLを返しません。

条件に応じて:

if (<condition>)
  strncpy (x,y,len);

x文字列リテラルが含まれているかどうかを確認するにはどうすればよいですか? それから私はする必要があるので:

strncpy(z,x,len);

どんなポインタでも大歓迎です。

4

3 に答える 3

2

x文字列リテラルが含まれているかどうかを確認するにはどうすればよいですか?

一般的にはできません。C は、ここで使用されるアドレスについて保証しないため、それらがどこから来たのかを確実に判断することはできません。

しかし、あなたはおそらく間違った方法で問題に取り組んでいます: そもそも、なぜこのような の起源についての混乱がx存在するのでしょうか? 値が常にmalloc'd であることを単純に確認したい場合はmalloc、直接アドレスを文字列リテラルに格納するのではなく、単純に常にそれを実行します。

(コピーの対象が値の起源に依存するというのは一般的に奇妙だと思います…)

于 2012-10-19T06:40:21.533 に答える
0

あなたの質問から私が理解したのは、strncpy関数が正常に返されたかどうかを確認したいということです。そして答えは::

strncpyは、エラーを示す値を返しません

printfしたがって、変数xに文字列リテラルが含まれていて成功したかどうかを正確に確認する必要があると思いますstrncpy

編集:: これを試してください:

int isZero ;
char * x = malloc(len);
memset(x, 0, len) ;
if (<condition>)
    strncpy ( x, y, strlen(y) + 1);

isZero = strlen(x) ; /* if not 0, you know something is copied */
if( isZero != 0 )
    strncpy( z, x, (strlen(x) + 1) );
于 2012-10-19T07:05:03.900 に答える
0

これは宿題の質問だと思います。とにかくmallocのマニュアルページから、

malloc() allocates size bytes and returns a pointer to the allocated memory.  The memory is not cleared.  If size is 0, then malloc() returns either  NULL,  or  a  unique pointer value that can later be successfully passed to free().

ほとんどの場合、mallocfailedNULLが返されるため、チェックを実行できます。

あなたの質問では、それが成功したif x contains any string literals ?かどうかを確認したいという意味だと思います。デフォルトでは、宛先へのポインターを返します。そのため、malloc が NULL を返した場合、確実にセグメンテーション フォールトに陥ります。strncpystrncpy

x の strlen が len と等しいかどうかを確認する簡単な方法があります。

strncpy は非常に汚れた関数であり、コードには多くのバグが発生しがちです!

man は初心者プログラマーの親友です。質問を投稿する前に、それらを調べて、もう少し調査を行う必要があると思います。

于 2012-10-19T07:08:42.620 に答える