过滤一个缓冲区并将其复制到另一个C中

时间:2016-04-20 16:03:19

标签: c string buffer

我正在尝试读取缓冲区,复制所有非字母字符并将其转储到另一个缓冲区中。

我遇到的问题是,每当遇到非数字字符时,它都不会复制任何内容。

我试图尝试检测空格,使用辅助缓冲区......

int main(void)
{
    char buffer[] = "103 PLUS 1";
    char buffer2[] = "a";
    int i, number;

    memset(buffer2, 0, sizeof (buffer2));
    size_t length = strlen(buffer);

    fprintf(stdout,"Buffer initially: %s \n", buffer);
    fprintf(stdout,"Buffer2 initially: %s \n", buffer2);

    for(i=0; i<length; i++)
    {
        if (number = isalpha(buffer[i]) == 0)
        {
            strncpy(&buffer2[i], &buffer[i], 1);
        }
    }
    fprintf(stdout, "Copied buffer is: %s \n", buffer2);
    return 0;
}

提前致谢。

2 个答案:

答案 0 :(得分:3)

  1. 您的代码将buffer2的第一个元素保留为0,表示C字符串的结尾。实际上,bufferbuffer2中相同字符的索引应该不同,因为字符在C字符串中必须一致,但不会复制某些字符。
  2. 无需使用buffer初始化"a"。请改用{0}
  3. 您不需要使用变量number
  4. 精炼代码:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int main(void)
    {
        char buffer[80] = "103 PLUS 1";
        char buffer2[80] = {0};
        int i, j = 0;
    
        size_t length = strlen(buffer);
    
        fprintf(stdout,"Buffer initially: %s \n", buffer);
        fprintf(stdout,"Buffer2 initially: %s \n", buffer2);
    
        for(i = 0; i < length; i++)
        {
            if (isalpha(buffer[i]))
            {
                strncpy(&buffer2[j++], &buffer[i], 1);
            }
        }
        fprintf(stdout, "Copied buffer is: %s \n", buffer2);
        return 0;
    }
    

    输出:

    Buffer initially: 103 PLUS 1 
    Buffer2 initially:  
    Copied buffer is: PLUS
    

答案 1 :(得分:2)

当你跳过复制一个字符时,buffer2会留下原来在那个位置的任何东西,它似乎是0(但可能并不总是如此),这就是为什么打印它看起来不像其他字符被复制了。实际上,它们,但跳过的字符被解释为该字符串的空终止。

但更糟糕的是,你永远不会为buffer2分配空间:你让编译器去做,这意味着你不能真正修改那个空间。与上面一样,你可能正在使用它,但它是未定义的行为,并且实际上可能会使你的程序崩溃。