web-dev-qa-db-ja.com

C:文字列に「x」スペースを追加/連結する方法

Cの文字列に可変数のスペースを追加したいのですが、自分で実装する前に、それを行う標準的な方法があるかどうかを知りたいと思いました。

今まで私はそれをするためにいくつかの醜い方法を使用しました:

  • 以下の関数のいずれかを呼び出す前に、連結するスペースに十分なメモリが割り当てられるように注意したと想定してください。

これは私が使用した1つの方法です:

add_spaces(char *dest, int num_of_spaces) {
    int i;
    for (i = 0 ; i < num_of_spaces ; i++) {
        strcat(dest, " ");
    }
}

これはパフォーマンスが優れていますが、標準に見えません。

add_spaces(char *dest, int num_of_spaces) {
    int i;
    int len = strlen(dest);
    for (i = 0 ; i < num_of_spaces ; i++) {
        dest[len + i] = ' ';
    }
    dest[len + num_of_spaces] = '\0';
}

それで、私のための標準的な解決策はありますか?それで、私は車輪の再発明をしませんか?

12

私はします

add_spaces(char *dest, int num_of_spaces) {
    int len = strlen(dest);
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}

しかし、@ selfが述べたように、destの最大サイズも取得する関数(この例では'\0'を含む)の方が安全です。

add_spaces(char *dest, int size, int num_of_spaces) {
    int len = strlen(dest);
    // for the check i still assume dest tto contain a valid '\0' terminated string, so len will be smaller than size
    if( len + num_of_spaces >= size ) {
        num_of_spaces = size - len - 1;
    }  
    memset( dest+len, ' ', num_of_spaces );   
    dest[len + num_of_spaces] = '\0';
}
7
Ingo Leonhardt
void add_spaces(char *dest, int num_of_spaces) {
    sprintf(dest, "%s%*s", dest, num_of_spaces, "");
}
4
BLUEPIXY

以下の関数のいずれかを呼び出す前に、連結するスペースに十分なメモリが割り当てられるように注意したと想定してください。

したがって、mainで、配列を_char dest[100]_のように宣言し、文字列を仕様で初期化するとします。

お気に入り

_char dest[100];
memset( dest,' ',sizeof(dest)); 
_

したがって、add_spaces(char *dest, int num_of_spaces)も必要ありません。

1
Jayesh Bhoi