C字符串截断错误
我正在研究一门关于语法分析的学校课程。目标是创建一种小型语言,以便使用cairo库创建矢量图形。我们选择在C中使用中间状态 我们使用Yacc生成一个由gcc编译的C代码。它工作得很好,但我对字符串有一些问题 以下是使用的代码:C字符串截断错误,c,string,yacc,C,String,Yacc,我正在研究一门关于语法分析的学校课程。目标是创建一种小型语言,以便使用cairo库创建矢量图形。我们选择在C中使用中间状态 我们使用Yacc生成一个由gcc编译的C代码。它工作得很好,但我对字符串有一些问题 以下是使用的代码: int sumChar = 0 ; char outnb1[20]; char outnb2[20]; sprintf(outnb1, "%f;", $4); sprintf(outnb2
int sumChar = 0 ;
char outnb1[20];
char outnb2[20];
sprintf(outnb1, "%f;", $4);
sprintf(outnb2, "%f;", $8);
sumChar = (6+strlen($2)+1+5+strlen($2)+1+strlen(outnb1)+strlen($6)+strlen($7)+strlen(outnb2)+strlen($10)+strlen($11)+1+1+strlen($14)+1);
// $ 14 is the string returned by another part of the code.
printf("String = %s\nSIZE = %d\n",$14,strlen($14));
//The printf here is exact and the string is not truncated :
//cairo_line_to ( cr ,prevPoint[0] ,prevPoint[1]);
//cairo_move_to ( cr ,prevPoint[0] ,prevPoint[1]);
char *result = malloc(sizeof(char)*sumChar);
sprintf(result, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s","\n\nint ",$2,";","\nfor(",$2,"=",outnb1,$6,$7,outnb2,$10,$11,")","{",$14,"}");
printf("String after sprintf = %s\nSIZE = %d\n",$14,strlen($14));
//The printf print something like :
//cairo_line_to ( cr ,prevPoint[0] ,prevPoint[1]);
//cairo_move_to ( cr ,prevPoint[0]�
$$ = result;
我真的不明白为什么字符串在malloc之后被截断。这显然是一个内存错误,但我不知道为什么。有什么想法或解决方案吗
编辑:
Yacc规则:
%union
{
double number;
char * str;
};
%token DRAW <number>NB <str>COMP <str>VARNAME <str>VARFOR <str>INC;
%type <str>D;
%type <str>BLOCFOR;
%type <str>FOR;
FOR : '(' VARFOR '=' NB ';' VARFOR COMP NB ';' VARFOR INC ')' '{' BLOCFOR '}'
{
int sumChar = 0 ;
char outnb1[20];
char outnb2[20];
sprintf(outnb1, "%f;", $4);
sprintf(outnb2, "%f;", $8);
sumChar += (6+strlen($2)+1+5+strlen($2)+1+strlen(outnb1)+strlen($6)+strlen($7)+strlen(outnb2)+strlen($10)+strlen($11)+1+1+strlen($14)+1);
printf("VALUE OF BLOCFOR = %s\nSIZE = %d\n",$14,strlen($14));
char *result = malloc(sizeof(char)*(sumChar+1));
sprintf(result, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s","\n\nint ",$2,";","\nfor(",$2,"=",outnb1,$6,$7,outnb2,$10,$11,")","{",$14,"}");
printf("VALUE OF BLOCFOR AFTER RESULT = %s\nSIZE = %d\n",$14,strlen($14));
printf("%s\n",result );
$$ = result;
}
BLOCFOR : DRAW D '$' {$$ = $2; printf("INSIDE BLOCFOR %s\nSIZE = %d\n",$2,strlen($2));}
result
是正确的,但是$=result
不起作用(我不能使用返回的值,因为它只是随机字符�G�+0��我�F���我�)
以下是lex源中str值的解析和返回:
<FOR>[[:alpha:]]+ {yylval.str = strdup(yytext);return VARFOR;}
[[:alpha:][]+{yylval.str=strdup(yytext);返回VARFOR;}
已解决:问题已解决,这是一个错误的sumChar计算和D令牌内的分配。变量
sumChar
不包含终止'\0'
字符的额外+1
。这很可能导致未定义的行为,您的问题可能是的症状。将其添加到sumChar
或调用malloc
。是result
NULL
?你确定分配了足够的内存吗?result
不是NULL
如果我分配了更多内存(大约100*sizeof(char)),我就把这个cairo行移动到(cr,prevPoint[0],prevPoint[1]);cairo移动到(cr,prevPoint[0]1
您能提供完整的Yacc规则吗?并告诉我们您如何解析和传递令牌值?如果您能提供一个超链接,那将是超级链接。请不要将这些添加为注释,而是编辑您的问题。我刚刚编辑了第一篇文章,提供了更完整的示例
<FOR>[[:alpha:]]+ {yylval.str = strdup(yytext);return VARFOR;}