displayX
@displayX (あーる)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C言語の「配列文字列」と「ポインタ文字列」の違いは何ですか?

解決したいこと

文字列を配列に入れると動くのに、ポインタに入れると動かないことがあります。

違いが全然わかりません。

発生している問題・エラー

// main()内です。
char s[] = "a,b,c"; // ← これが char *s だとエラーが出ます。
char* token = strtok(s, ",");
while(token != NULL){
    puts(token);
    token = strtok(NULL, ",");
}

この例は動きますが、char s[] を char *s にすると動きません。
意味が分かりません。

0

1Answer

Comments

  1. @displayX

    Questioner

    なるほど、仕様ですか。
    C言語では文字列リテラルは変更が出来ないんですね。
    ありがとうございます。

    ところで、関数の引数として文字列を渡した場合は、文字列リテラルになるようです・・・。

    void func(char sr[], const char sp[]) {
    char str[] = sr; // 配列に代入してもエラー

    char *token = strtok(sr, sp);
    // char *token = strtok(str, sp); どちらもエラー
    while(token != NULL){
    puts(token);
    token = strtok(NULL, sp);
    }
    }
    int main() {
    char s[] = "a,bb,ccc";
    char sp[] = ",";
    func(s, sp);
    return 0;
    }
    関数に「文字列」を渡すのは不可能でしょうか?
  2. @displayX

    Questioner

    済みません。
    関数に「文字列」を渡すのは、自己解決しました。

    void func(char sr[], char sp[]) {
    char str[50] = ""; // 文字列を用意
    strcpy(str, sr); // 文字列にコピー

    char *token = strtok(str, sp);
    while(token != NULL){
    puts(token);
    token = strtok(NULL, sp);
    }
    }
    strcpy()で「文字列リテラル」を「文字列」にコピーすることで行けました。

Your answer might help someone💌