2017-12-27 20 views
0

で5番目の文字の後に私はchar型の配列を持っている、と私はすべての5つの文字の後にハイフンを挿入します。次のコードを試しましたが、このタスクを実行するためのより良い方法、文字列関数を使用する方法、およびその方法を探していますか?ありがとう。 :D挿入ハイフンはC

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char str[]="356a192b7913b04c54574d18c28d46e6395428ab"; 
    char buf[50]; 

    sprintf(buf, "%.5s-%.5s-%.5s-%.5s-%.5s-%.5s-%.5s-%.5s",str, str+5,str+10,str+15,str+20,str+25,str+30,str+35,str+40); 
    printf("%s",buf); 
    return 0; 
} 
+1

限り多くのハイフンを挿入するためにループを使用して、[ここ](https://stackoverflow.com/questions/7459259/inserting-characters-into-a-string)与えられた答えに記載されている情報を使用し、 –

+0

警告をオンにするのと同じようにハードコーディングする必要はありません。あなたの 'sprintf'行に引数が多すぎると、gccとclangが私に警告しました...これはおそらくUBです。しかし、どのようなアウトプットを得ますか?次のコードは私のために働いていた私は、[文字列に挿入する文字]の欲しいものを – yano

+0

が重複する可能性を得ているように見える(https://stackoverflow.com/questions/7459259/inserting-characters-into-a-string) –

答えて

2

は、ここで私はあなたのため手早くヘルパー関数です。これは、文字列をパラメータとして必要なハイフンスペーシングと一緒に受け取り、その中にハイフンを含む新しい文字列を返します。文字列の最後にハイフンがないことを確認します。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char* hyphenize(const char* str, int spacing) 
{ 
    size_t len, newlen; 
    char *ptr, *buf; 

    if (spacing < 1) 
    { 
     return NULL; // error! 
    } 

    len = strlen(str); 
    newlen = len + (len/spacing) + 1; 
    buf = (char*)malloc(newlen); 
    ptr = buf; 
    for (size_t x = 0; x < len; x++) 
    { 
     *ptr++ = str[x]; 
     if ((x != 0) && (x != (len - 1)) && ((x + 1) % spacing == 0)) 
     { 
      *ptr++ = '-'; 
     } 
    } 
    *ptr = '\0'; 
    return buf; 
} 

int main() 
{ 
    char str[] = "356a192b7913b04c54574d18c28d46e6395428ab"; 
    char* p = hyphenize(str, 5); 
    printf("%s\n", p); 
    free(p); 
    return 0; 
} 
+0

非常に素晴らしい機能)あなただけのメイン(にコードを置く機能でそれを置くことなく、私の別の例を提供してくださいすることができ、ありがとう – Djmc

+0

@Djmc:それはナンセンス要求だ - あるいは、もう少し寛大、初心者の兆候。メインではなく、関数でコードが必要です。あなたは 'main()'のコードとして関数内にあるコードを書きません。この原因を尋ねる –

+0

アムは、私はすでに、ハードウェアベースのプロダクトキーを生成する機能を持っているし、私の代わりに別の関数に飛び込むのこの関数にこのコードを組み込みたいです。もちろん、これをメイン関数で直接コーディングしているわけではありません。したがって、仮定をしないでください。 – Djmc

5

あなたは(length - 1)/5ハイフンをしたい知っています。したがって、bufの場合は、buf[len + (len -1)/5 + 1];文字のストレージが必要です。単にstrの文字をループとIF i % 5 == 0strから文字をコピーに加えbufにハイフンを書き込む(i = 0ケーススキップ)を。あなたは、単にループテスト句としてstr[i]を使用することができます

#include <stdio.h> 
#include <string.h> 

#define HYPHPOS 5 

int main(void) { 

    char str[] = "356a192b7913b04c54574d18c28d46e6395428ab"; 
    size_t len = strlen (str); 
    char buf[len + (len -1)/ HYPHPOS + 1], *p = buf; 

    for (size_t i = 0; i < len; i++) { 
     if (i && i % HYPHPOS == 0) 
      *p++ = '-'; 
     *p++ = str[i]; 
    } 
    *p = 0; 

    printf ("str : %s\nbuf : %s\n", str, buf); 

    return 0; 
} 

:一緒にそれを置く

は、あなたがに似た何かを行うことができます。

使用例/出力

$ ./bin/hyphenate 
str : 356a192b7913b04c54574d18c28d46e6395428ab 
buf : 356a1-92b79-13b04-c5457-4d18c-28d46-e6395-428ab 

ルック物事を超えるとさらにご質問がある場合は私に知らせてください。

+4

は、それは '、+ LEN/5' lenはできないではない'%5'べきでしょうか? ) '' – happydave

+1

うんは、我々はすべて私たちのモーメントが'持っています。 '' char str [] = "1"; '' buf [] 'はサイズ2以上でなければならないと考えています。 –

+0

のchar bufが[LEN + lenが/ HYPHPOS] '小さすぎ1表示されます: – chux

関連する問題