读书人

问一个神奇的有关问题, 关于printf字符

发布时间: 2012-02-24 16:30:38 作者: rapoo

问一个神奇的问题, 关于printf字符串
我从文件中按行读取字符串
while(1) {
if (fgets(rawLine, MAX_LINE_SIZE, yyin) == NULL) {
return -1;
}
else {
//- make sure the line is terminated
if (rawLine[strlen(rawLine)-1] != '\n ') {
rawLine[strlen(rawLine)] = '\n ';
rawLine[strlen(rawLine)+1] = '\0 ';
}
printf( ":::%d\t\t%s ",strlen(rawLine), rawLine);
break;
}
}
本来程序很好用的, 但是今天下午解析一个两万多行的文件时,突然有了个段错误:


要读入的文件在3000多行的位置是这些数据:
//////////////////////////////////////////////////////////////////////////////
// Code Area //
//////////////////////////////////////////////////////////////////////////////
// Global Registers //
// ---------------- //
// r10 flag_reg //
// r9 fifo //


// r8 word_buffer //
// r7 bit_ptr //
//////////////////////////////////////////////////////////////////////////////
// flag_reg (initial value 0x00000040) //
// -------- //
// bit 00 -> flag_noemupre -> {0,1}{emupre,noemupre} //
// bit 01 -> flag_slicetype -> {0,1}{I,P} //
// bits 05:02 -> flag_mb_avail -> {0,1}{nav,av} ACBD //
// bits 07:06 -> flag_false_true -> always set to 01 //
// bits 09:08 -> flag_intra_mode -> {00,10,11}{inter,intra4x4,intra16x16} //
// bits 11:10 -> flag_disable_df -> {00,01,10}{df,nodf,restrictdf} //
// bit 12 -> flag_top_frbnd -> {0,1}{no_top_frbnd,top_frbnd} //
// bit 13 -> flag_left_frbnd -> {0,1}{no_left_frbnd,left_frbnd} //


// bit 14 -> flag_error -> {0,1}{noerror,error} //
// bit 15 -> flag_seek_idr -> {0,1}{normal,seekidr //
// bits 31:28 -> flag_cbpc //
// bits 27:24 -> flag_cbpl //
//////////////////////////////////////////////////////////////////////////////


而我读取文件并显示得到的结果如下,对应上面的最后5行,看下面这段的最后一行:
参考: printf( ":::%d\t\t%s ",strlen(rawLine), rawLine);


:::80// bit 14 -> flag_error -> {0,1}{noerror,error} //
:::80// bit 15 -> flag_seek_idr -> {0,1}{normal,seekidr //
:::80// bits 31:28 -> flag_cbpc //
:::80//


让我感到奇怪的是: 明明用strlen显示出该字符串有80个字符, 怎么只能打印出3个出来????
这样肯定会出现段错误的.

[解决办法]
rawLine怎么定义的?什么编译器?
你在用lex/yacc吧。
[解决办法]
换个编译器试试吧。
[解决办法]
确定fgets取出来是对的吗?是不是遇到一些奇怪字符?
[解决办法]
rawLine[strlen(rawLine)] = '\n '; //把字串最后的0清了
rawLine[strlen(rawLine)+1] = '\0 '; //这里strlen得到的长度不对了...

读书人网 >C++

热点推荐