2017-02-27 35 views
2

これは、strcat()strncat()の2つの文字列を連結する機能を使用している問題に直面しているコードの特定のセクションです。Cのstrcat関数とstrncat関数の別の代替手段は何ですか?

strcat()関数は2番目のパラメータは'\0'で終わっていない文字列から単一の文字、すなわち、ある場合しかし、それらの両方が問題を与える、char *strncat(char *dest, const char *src, size_t n)としてchar *strcat(char *dest, const char *src)strncat()として宣言されます。文字を文字列に連結する必要があります。

これらの2つの機能に代わるものはありますか、またはこれらの機能を私にとって機能させる方法はありますか?ここ

char *cipher_str = (char *)malloc(sizeof(char) * 26); 
    for (int j = 0; j < col; j++) { 
     for (int i = 0; i < col; i++) { 
      if (min == cipher[0][i] && (done[i] != 1)) { 
       done[i] = 1; 
       for (int k = 0; k < rows; k++) 
        strcat(cipher_str, cipher[i][k]); 
       } 
      } 
      ... 
+0

cipher' 'の定義を提供してください。 –

+5

一文字だけを追加する場合は、 'int l = strlen(s);を使用できます。 s [l] = ch; s [l + 1] = 0; '(sに十分なスペースが割り当てられている場合) – Ctx

+0

@PaulOgilvie char cipher [rows] [col]; –

答えて

3

Thの最も簡単な方法は、ちょうど例えば、文字列に「手動」の文字を追加することです:

int m=0; 

    .... 
     cipher_str[m++]=cipher[i][k]; 
    .... 
    cipher_str[m]='\0'; 
+0

ありがとう!ソリューションは機能しました! –

2

あなたは1つの文字を追加するstrcatのを使用しているので、この機能を使用することができます。

void strcat(char* dest, char src) 
{ 
    int size; 
    for(size=0;dest[size]!='\0';++size); 
    dest[size]=src; 
    dest[size+1]='\0'; 
} 

そして、あなたはあなたがあなたの「cipher_str」の最後に「\ 0」を持っていることを述べたが、私は長さを決定するためにそれを使用しました。

0

Cのstrcatおよびstrncat関数の別の代替手段は何ですか?

インラインコードは、@Paul Ogilvieと同じようにsize_t mと同じように動作します。

としてスタンドアローン機能:

char *strcat_c(char *s, char c) { 
    size_t len = strlen(s); 
    s[len++] = c; 
    s[len] = '\0'; 
    return s; 
} 

char *strncat_c(char *s, char c, size_t n) { 
    char sc[2] = { c, '\0' }; 
    return strncat(s, sc, n); 
} 

// or with C11 compound literals 

char *strncat_c(char *s, char c, size_t n) { 
    return strncat(s, (char [2]) { c, '\0' }, n); 
} 
0

は長さ1の文字列に単一の文字を変換し、その後、バッファは

をオーバーフロー注意 strcat()

#include <string.h> 

void appendchar(char *x, char y) { 
    char z[2]; 
    z[0] = y; 
    z[1] = 0; 
    strcat(x, z); 
} 

char data[1000] = "foo"; 
appendchar(data, 'b'); 
appendchar(data, 'a'); 
appendchar(data, 'r'); 
puts(data); 

を使用

0

はあなたのコードで複数の問題があります。

  • cipher_strmalloc()に割り当てられているので、初期化されていないです。 strcat()の宛先文字列として渡すと、適切な文字列が含まれていないため、未定義の動作が発生します。

  • に第2引数としてcharを渡すと、間違っています。

    char *cipher_str = calloc(26); 
    for (int j = 0; j < col; j++) { 
        for (int i = 0; i < col; i++) { 
         if (min == cipher[0][i] && done[i] != 1) { 
          done[i] = 1; 
          for (int k = 0; k < rows; k++) 
           strncat(cipher_str, &cipher[i][k], 1); 
          } 
         } 
         ... 
    

をしかし、それは、この単純な作業のための機能を呼び出すためにやり過ぎであるとcipher_strが十分長い場合はチェックしません:あなたは、単一のcharを追加する機能を使用して主張した場合、あなたは書くことができます。ここで

は、インデックス変数とはるかに簡単な解決策です:

char *cipher_str = (char *)malloc(sizeof(char) * 26); 
int ii = 0; 
for (int j = 0; j < col; j++) { 
    for (int i = 0; i < col; i++) { 
     if (min == cipher[0][i] && (done[i] != 1)) { 
      done[i] = 1; 
      for (int k = 0; k < rows; k++) { 
       if (ii < 25) { 
        cipher_str[ii++] = cipher[i][k]; 
       } else { 
        // cipher_str is too short for the job. 
       } 
      } 
     } 
     cipher_str[ii] = '\0'; 
     ... 
関連する問題