あなたはst
の内容を変更するつもりはありませんので、先に行くとconst
としてそれを宣言する。あなたの関数に新しい文字列を割り当てるつもりなので、それを呼び出し側に返すべきです。
char *repeat(const char* st,int n){
k
は問題ではありません。標準関数を呼び出します。これはC. sizeof(char)
で致命的なエラーが成功のためのmalloc
呼び出しの結果を確認し、常に1です。隠すことができるよう
int i,l=strlen(st);
char* ptr;
は、malloc
の結果をキャストしないでください。
ptr=malloc(n+1);
if (ptr == NULL) return NULL;
for (i=0;i<n;i++){
アイドルには[]
でアクセスします。i
の場合はk
が増分しますが、モジュロ演算を適用する場合はk
となります。ただし、Cにはモジュロ演算子があります。これはi
で直接使用できます。
ptr[i]=st[i%l];
}
新しい文字列がNUL
であることを確認してください。あなたの関数は結果を返すと宣言されていますが、あなたの実装では結果が返されません。
Cには、作成したバイトごとのループではなく、あなたのために呼び出すことができる多くの機能があります。実装にはシンプルさがありますが、以下では、ソリューションに欠けている追加のエラーチェックも含まれています。
(一部はsprintf
の使用に尻込みかもしれないが、それは正しく使用されている。)
char *
repeat (const char *st, int n) {
int l = st ? strlen(st) : 0;
char *ret = (st && n > 0 ? malloc(n+1) : 0), *p = ret;
while (ret && n > 0) {
p += sprintf(p, "%.*s", (l < n ? l : n), st);
n -= l;
}
return ret ? ret : "(nil)";
}
Try it online!
出典
2017-12-18 23:46:42
jxh
あなたはメモリを割り当て、ptr' 'でそのアドレスを格納しますが、あなたは' PTRを破棄します'関数の最後に。これはメモリをリークするだけでなく、操作の結果を破棄します。あなたは 'ptr'を返すべきではありませんか? – cdhowie
また、割り当てられた文字列もNULL終了する必要があります。 –
それは何をすべきか対何をすべきか? –