str系関数とmem系関数の違いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TRAIN

str系関数とmem系関数の違いについて

#1

投稿記事 by TRAIN » 17年前

初めまして。
C言語の関数について質問があるのですが、
文字列操作系関数のstr系関数(strcpy、strcmp、strncpy等)と、
mem系関数(memcpy、memcmp等)には、どういった違いがあるのでしょうか?

私が調べて出た結論は、strcpyは、
・書き込み先のサイズを知っていなければならない。
・読み込み元の値は\0で終了している。
・元の長さが先のサイズを超えてはいけない。

等の制約があり、間違えて使うとメモリを破壊する可能性があるので多様すべきではない。
なので、次数制限機能があるstrncpyを使ったほうがいい。


と言う所まで分かり、strncpy≒memcpy と言う結論に出たのですが、
問題を出して来た相手の期待している返答は『str系関数とmem系関数の違い』との事でして、
この解答では駄目だそうです。


ヒントとしては、
char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
memcpyは問題ないがstrncpyでは正常な動作をしない、との事らしいです。
(口頭でのヒントでメモも取れず、もしかしたら間違っているかも知れませんが・・・)
後は、やはりメモリ関係が答えのヒント、らしいです。



長文な上に説明力が無く、訳がわからない質問かと思われますが、
宜しければどなたかご指導お願いいたします。

管理人

Re:str系関数とmem系関数の違いについて

#2

投稿記事 by 管理人 » 17年前

文字列として扱う関数か、何でもいいからメモリの情報として扱う関数かの違いじゃないでしょうか。(文字列もメモリの情報ですが)
この問題は、「文字列は終端記号'\0'で終わっている」という知識が無いとわからないので、
もしその辺わからなければ、検索でもして勉強してください。

>ヒントとしては、
>char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
>memcpyは問題ないがstrncpyでは正常な動作をしない、との事らしいです。

str[8]に8桁の文字列を入れるというのは最後に終端記号を入れなかった場合ということでしょう。
しかし、strncpyを使ったら別に不具合ないはずですが。
先ほどのヒントで、

>ヒントとしては、
>char str[8]に8桁の文字列を入れて、その値をコピーしようとすると、
>memcpyは問題ないがstrcpyでは正常な動作をしない、との事らしいです。

なら意味はわかります。
memcpyもstrncpyも、指定したサイズだけコピーするのに対して、
strcpyは「終端記号が見つかるまでコピーする」という仕様ですので、最後に終端記号を書いていない場合は
ひたすら用意してない、踏み入ってはいけない領域まででもお構いなしに突き進んでひたすらコピーします。
だから最後に終端記号のない文字列をstrcpyに渡すと不具合がおきます。

関数については、そのまんま検索すればわかりやすい解説出てきますよ。

strcpy
http://www9.plala.or.jp/sgwr-t/lib/strcpy.html

strncpy
http://www9.plala.or.jp/sgwr-t/lib/strncpy.html

memcpy
http://www9.plala.or.jp/sgwr-t/lib/memcpy.html

memcpyに書いてあるvoid *buf1というのは、「どんな型でも渡していいよ~」という意味です。
しかしstrcpyはcharのみなので、文字列限定と言うことになります。

閉鎖

“C言語何でも質問掲示板” へ戻る