2017-02-27 440 views
2

這是我使用strcat()strncat()函數連接兩個字符串時遇到問題的代碼的特定部分。C中strcat和strncat函數的另一種替代方法是什麼?

strcat()函數被聲明爲char *strcat(char *dest, const char *src)strncat()作爲char *strncat(char *dest, const char *src, size_t n),但是他們的兩個得到的問題時,第二個參數是從字符串的單個字符,即,其不與'\0'結束。我需要將一個字符連接到一個字符串。

那麼這兩個函數還有什麼替代方法,或者有什麼方法可以使這些函數適合我嗎?

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

釷最容易在這裏的方式就是追加字符「手動」的字符串,例如:

int m=0; 

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

謝謝!該解決方案工作! –

2

由於您使用的strcat追加1個字符,你可以使用這個功能。

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

而且你提到你有「\ 0」你「cipher_str」結束時,我用它來確定長度。

0

什麼是C中的strcat和strncat函數的另一種替代方法?

聯機代碼可以很好地與size_t m一起工作,就像@Paul Ogilvie回答。

作爲獨立的功能:

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()的目標字符串傳遞時存在未定義的行爲,因爲它不包含正確的字符串。

  • char作爲第二個參數傳遞給strcat是不正確的。如果你堅持使用功能追加單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 *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'; 
     ... 
相關問題