2013-06-30 199 views
0

我想在C字符在C另一個字符串

我更換' '(空間)與'___'(三重底線)是我的代碼:

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

int main() 
{ 
    char *a = "12 34 56"; 
    int a_l = strlen(a); 
    printf("str1: \"%s\" (%d)\n", a, a_l); 

    char *b = "___"; 
    int b_l = strlen(b); 
    printf("str2: \"%s\" (%d)\n", b, b_l); 

    for (int i = 0; i < a_l; i++) { 
     if (a[i] == ' ') { 
     char *o = malloc(a_l + b_l); 

     strncpy(o, a, i); 
     strncpy(o + i, b, a_l); 
     //strncpy help 

     printf("out: \"%s\"\n", o); 
     } 
    } 

    return 0; 
} 

我認爲,它是正確的,但我需要用正確的strncpy(其餘字符串a(不包括空格)並將其附加到字符串o)替換註釋行。所以輸出應該是這樣的:

str1: "12 34 56" (8) 
str2: "___" (3) 
out: "12___34 56" 
out: "12 34___56" 

如果我的代碼還有其他錯誤,請告訴我。

UPD:這不應該替換循環中的所有空格。如果源字符串包含8個空格,則應打印8行,並且在每行中只應替換一個空格。

+0

看看strtok函數。 –

+0

@V_Maenolis好主意,但是由於'strtok()'修改了字符串,所以它不會在'a'這裏指向文字/固定''12 34 56「'。 –

+1

在您的代碼示例中,您將創建兩個o字符串您必須首先計算字符串中的空格字符,然後分配適當的空間來容納新字符串或重新分配您找到的exery空間的o字符串。 –

回答

6

你太過於複雜了,我只是TL; DR。

一些言論,你可能肯定想閱讀,學習,接受良好及用途:

int不是字符串長度和東西。 size_t是用於字符串長度和東西。

二,字符串文字不能被修改,所以使用傳統的char *類型將它們分配給一個變量是沒有用的,const - 使那些差的指針基類型變得合格。

三,如果不需要動態內存管理(我們不再生活在1989年),請使用VLA而不是malloc()。四,參考文獻NUL - 終止您的字符串,因爲C stdlib例程期望您這樣做。

int main() 
{ 
    const char *in = "foo bar baz"; 
    int nspc = 0; 

    for (const char *p = strchr(in, ' '); p; p = strchr(p + 1, ' ')) 
     nspc++; 

    char buf[strlen(in) + nspc * 2 + 1]; 
    memset(buf, 0, sizeof(buf)); 

    const char *s = in; 
    for (const char *p = strchr(s, ' '); p; p = strchr(s, ' ')) { 
     strncat(buf, s, p - s); 
     strcat(buf, "___"); 
     s = p + 1; 
    } 

    const char *end = in + strlen(in); 
    strncat(buf, s, end - s); 

    printf("%s\n", buf); 
    return 0; 
} 
+0

噢,是的,這是嚴重的不理想(循環遍歷輸入字符串兩次,重複調用'strcat()'使連接運行在'O(n^2)'而不是'O(n)' ),但是直到字符串比幾十千字節短,這個「性能問題」根本就不是問題。如果您需要這樣做,請進行基準測試並對其進行優化。 – 2013-06-30 21:15:33

+1

有點混亂......它可以用一個循環來完成。 –

+0

@RamyAlZuhouri Char-by-char?當然,我不想要這個,而我們可以從''中使用stdlib函數。嚴重的是,這是你降低投票的原因嗎? – 2013-06-30 21:42:28

2

你可以試試這個。問題來自於你的malloc中的a_l + b_l始終是相同的值。它不受空間數量的影響。

int count = 0, index = 0; 
for (int i = 0; i < a_l; ++i) { 
    if (a[i] == ' ') { 
     count++; 
    } 
} 

const char *o = malloc(a_l + 2 * count + 1); // 2 is because you add 3 new symbols, but remove 1 so 3 - 1 = 2 
memset(o, 0, sizeof(o)); 

for (int i = 0; i < a_l; ++i) { 
    if (a[i] != ' ') 
     o[index++] = a[i]; 
    else { 
     o[index++] = '_'; 
     o[index++] = '_'; 
     o[index++] = '_'; 
    } 
} 
+0

因爲我們留在'main()'裏面,所以'malloc()'是不需要的。另外,'NUL'終結符在哪? – 2013-06-30 21:09:18

+0

是的,你完全正確。我已經錯過了NULL終止符,並使用malloc,因爲我遵循示例代碼。 –

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

size_t my_strlen(const char *str, size_t *spc){ 
    size_t len; 
    *spc = len = 0; 
    while(*str){ 
     ++len; 
     if(*str++ == ' ')++*spc; 
    } 
    return len; 
} 

int main(void){ 
    char *a = "12 34 56"; 
    size_t spc; 
    int a_l = my_strlen(a, &spc); 
    printf("str1: \"%s\" (%d)\n", a, a_l); 

    char *b = "___"; 
    int b_l = strlen(b); 
    printf("str2: \"%s\" (%d)\n", b, b_l); 

    char *p, *o = malloc(a_l - spc + spc * b_l + 1); 
    p=o; 
    for (int i = 0; i < a_l; i++) { 
     if(a[i] == ' ') { 
     strncpy(p, b, b_l); 
     p += b_l; 
     } else { 
     *p++ = a[i]; 
     } 
    } 
    *p = '\0'; 
    printf("out: \"%s\"\n", o); 
    free(o); 
    return 0; 
} 
+0

爲什麼'malloc()'?爲什麼'int'(而不是正確的'size_t')爲字符串長度?應該指向'const char'的指針之前的'const'在哪裏? – 2013-06-30 21:10:19

+1

我不知道你在說什麼。 – BLUEPIXY

+0

我本可以猜到... – 2013-06-30 21:16:15

0

我看到很多的答案已經被添加,但是這可能是帶有單環做得非常簡單。由於字符串是很短的,你可以犧牲存儲在CPU和分配數組3倍+1大於原始字符串,並確保它不會溢出:

const char* string= "12 34 56"; 
size_t length= strlen(string); 
char result[length*3 +1]; 
unsigned int index= 0; 
memset(result, '\0', length*3+1); 
for(int i=0; i<length; i++) 
{ 
    if(string[i]!= ' ') 
    { 
     result[index++]= string[i]; 
    } 
    else 
    { 
     strcat(result,"___"); 
     index+= 3; 
    } 
} 
0

我發現了另一個thread和閱讀的答案之後,我想通了,正確的路線應該是這樣的:

strncpy(o + i + b_l, a + i + 1, a_l - i); 

,並提出在此線程我的代碼看起來像這樣一些修正後:

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

int main() 
{ 
    char *a = "12 34 56"; 
    size_t a_l = strlen(a); 
    printf("str1: \"%s\" (%d)\n", a, a_l); 

    char *b = "___"; 
    size_t b_l = strlen(b); 
    printf("str2: \"%s\" (%d)\n", b, b_l); 

    for (int i = 0; i < a_l; i++) { 
     if (a[i] == ' ') { 
     char *o = malloc(a_l + b_l); 

     strncpy(o, a, i); 
     strcpy(o + i, b); 
     strncpy(o + i + b_l, a + i + 1, a_l - i); 

     printf("out: \"%s\"\n", o); 
      free(o); 
     } 
    } 

    return 0; 
} 

然後打印所需的輸出。

1

沒有使用庫函數!!!

while(*string) 
     { 
        if(*string=='\\') 
       { 
         *string++; 
         while(repl_len--) 
         *dest++ = *repl_string++; 
       }    
       else 
       { 
         *dest++ = *string++; 
       } 
      repl_string = temp_repl_string; 
      repl_len = temp_repl_len;  
     } 
+0

這是一個很好的。謝謝。 – CYB3R

相關問題