1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cでsplit関数(改良版)

Last updated at Posted at 2022-09-13

昨日からいろいろな方にアドバイスをもらったので
それを踏まえていろいろ改良してみました

ソースコード

split.c
#include <string.h>

size_t split2(char* str, char* regex, char** buf, size_t buflen){
    size_t len = 0;
    char* ptr = strtok(str, regex); 
    while(ptr!=NULL)
    {
        if(buflen <= len){
            break;
        }
        buf[len] = ptr;
        len++;
        ptr = strtok(NULL, regex);
    }
    return len;
}

引数や戻り値は前回とほぼ同じで

引数strが引用する文字列
引数regexが分割するための文字の引数(strtokを使うためcharからchar*に変更)
引数bufはその分割した配列を入れるためのバッファ
引数buflenは そのバッファのサイズ

戻り値は、その配列の個数が返ってきます

変更点

まず、新しく知ったstrtok関数というものを使ってみました
(これさえあればそれでいいじゃんとか言わない)
このおかげで前回の三倍ほどの速度で処理ができるようになりました

あとは、buflenに0などを代入してもbuf[0]に要素が入るっていう
割と致命的なバグを指摘されたので 容量があるかの判定を
要素を入れる前に持ってきました
これにより、ゼロやマイナスの値を代入されても大丈夫
(size_tは内部的にunsigned longだからマイナスは受け付けないけどね)

色々アドバイスをもらって

自分はほんとにまだまだ未熟だと感じました
まだまだstrtokのような便利な関数も知らなかったし
型とか揃えることや、潜在的なバグを見抜けなかったり…

しかし、そういうアドバイスをもらえることがqiitaの醍醐味だと思うので
これからもめげずに書いていきます 

1
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?