2016-10-01 86 views
1

我有这个问题解析一个字符串,也许你可以帮助。解析字符串打印垃圾

我不是来自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 

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

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

+0

哪个输入产生垃圾? –

+1

为什么不发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)? – MikeCAT

+0

'p = strstr(p,“,”);' - >'p = strstr(prev,“,”);'... print prev。 – BLUEPIXY

回答

2

当事情大部分时间工作,但有时你会得到垃圾,这是未定义的行为。这意味着DataIn指向无效的内存 - 某些已被解除分配,或者分配在已完成工作的功能的堆栈上。

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

注:有两种情况,当你的循环结束:

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

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

+0

谢谢我知道我必须检查p,但是当我收到崩溃时,我可以看到DataIn是有效的,并且具有我正在搜索的所有字符。 – Curnelious

+0

@Curnelious使用valgrind运行,即使代码不打印垃圾,它也会立即指出问题。 – dasblinkenlight

+0

那么这段代码是在芯片上,所以我没有所有可用的工具。但是,你能解释DataIn有效的可能性吗?我会搜索逗号而不是找到它?我可以打印它并看到它的有效(?) – Curnelious