【问题标题】:Filter one buffer and copy it into another C过滤一个缓冲区并将其复制到另一个 C
【发布时间】:2016-04-21 00:47:07
【问题描述】:

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

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

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

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;
}

提前致谢。

【问题讨论】:

  • buffer2[] 只有 1 个字符,大小为 2,不能容纳更多。您将其索引到 buffer[] 的长度,这是 未定义的行为
  • 在调试器中运行你的程序——这对你有很大帮助。另外,我可以告诉您,您的 if (number = isalpha(buffer[i]) == 0) s/b 已更改为 if ((number = isalpha(buffer[i])) == 0))
  • @KevinDTimm 是我的错 :) 我没有定义缓冲区的大小是我做的测试之一,忘记再次修复它。
  • 请不要更改问题。它使回复变得无意义。回滚。

标签: c string buffer


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

精炼代码:

#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

【讨论】:

    【解决方案2】:

    当您跳过复制一个字符时,buffer2 会留下原来在该位置的任何内容,这似乎是 0(但可能并不总是),这就是为什么打印出来看起来没有其他字符复制。事实上,它们,但跳过的字符被解释为该字符串的空终止符。

    但更糟糕的是,您永远不会为 buffer2 分配空间:您让编译器来做,这意味着您实际上无权修改该空间。与上面一样,您可能会侥幸逃脱,但这是未定义的行为,实际上可能会使您的程序崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2012-09-29
      • 2016-01-04
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多