2013-06-30 197 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

相关问题