電子書籍の厳選無料作品が豊富!

char * p
char *pは何が違うのでしょうか

また、#pragma warning(disable: 4996)


#include <stdio.h>   // puts, printf
#include <string.h>  // strcpy, strtok


int main()
{
    const char* str = "abc:123\n,tdef:45,ghi:678.";
    char buf[1024], * p;

    strcpy(buf, str);
    puts("-- \",\\t\\n\" --");
    p = strtok(buf, ",\t\n");
    while (p) { printf("[%s]\n", p); p = strtok(NULL, ",."); }
}について、abc:123\n,.tdef:45,.ghi:678.でないのになぜ、
[abc:123]
[tdef:45]
[ghi:678]
となるのかわかりません。

A 回答 (1件)

> char * p


> char *pは何が違うのでしょうか

同じでしょ。
Cのポインタ周りの文法が腐ってるだけ、です。

> abc:123\n,.tdef:45,.ghi:678.でないのになぜ、

なぜ、って何がなぜなんだか分からんのですが。

> strcpy(buf, str);

バッファbufにstrをコピーする
従って、現時点で

buf = "abc:123\n,tdef:45,ghi:678.";

です。

> p = strtok(buf, ",\t\n");

strtokはこの場合、タブか改行文字が見つかる度にそれらを\0で置き換えていく。
だからこの時点で

buf = "abc:123\0,tdef:45,ghi:678.";

と書き換えられる。

> printf("[%s]\n", p);

%sは(pが)指定したアドレスから連続したメモリで、\0が出てくるまでをひとまとめにして表示する。

> p = strtok(NULL, ",.");

strtokは\0で置き換えた次の位置以降、今度はカンマかピリオドが出て来たら\0で置き換える。

以下繰り返し、でしょ?

これもホントは質問するような話じゃなく、strtokの使い方探せば分かる話なんですけどね〜。

C言語 strtok 使い方 :
https://bituse.info/c_func/18

ちなみに、こういう場合、bufを印字してみればイイんですよ。
元々bufに入ってる文字の数数えてさ。
例えばこんな風にして。

for (int i = 0; i < 26; i++) {printf("%c", buf[i]);}
printf("\n");

"%s"なら\0が出てくるまで、だけど%cは別に関係ないし、元のbufと言う配列からどう変更されたのか分かるでしょ。
何なら次のようにしてチェックしてみても良いです。

for (int i = 0; i < 26; i++) {printf("%d\n", buf[i]);}

アスキーコード表:
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

と比較したら「一体何が起きたのか」分かるでしょ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!