解析字符串会打印垃圾

时间:2016-10-01 10:59:59

标签: c

我有解析字符串的问题,也许你可以提供帮助。

我不是来自C领域,所以请尽量对我做的愚蠢事情保持耐心。

我有这个:

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

char DataIn[65] = "WV,000B,404C494748543B.";

int main()
{
    char *p = DataIn;

    puts(DataIn);

    for (int count = 0;count<2 ; ++count) {
        p = strstr(p, ",");
        if (!p )
            break;
        p++;            
    }

    char *endPointer = strchr(p, '.');
    *endPointer = '\0';

    puts(p);
}

此示例中我想要的输出是:404C494748543B(可以有不同的长度)。

当我打印p时,通常就可以了,但有时,只是偶尔,我明白了:

404C494748543B
X
@LIGHT;
��
@LIGHT;

    ��03

其中包括一些以前的数据+垃圾。

我提取数据的方式有问题吗?

1 个答案:

答案 0 :(得分:2)

当事情大部分时间都在工作,但有时你会得到垃圾,这是不确定的行为。这意味着DataIn指向无效内存 - 已取消分配的内容,或者已在已完成工作的函数的堆栈上分配。

诊断和解决此问题的最佳方法是通过内存分析器运行代码,例如valgrind

注意:循环结束时有两种情况:

  • count到达2(正常退出)或
  • p设置为NULL(休息时)

但是,搜索endPointer的代码假设p没有NULL而没有任何检查,这意味着当循环退出break时,您的程序可能会崩溃