Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符串截断错误_C_String_Yacc - Fatal编程技术网

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

我正在研究一门关于语法分析的学校课程。目标是创建一种小型语言,以便使用cairo库创建矢量图形。我们选择在C中使用中间状态

我们使用Yacc生成一个由gcc编译的C代码。它工作得很好,但我对字符串有一些问题

以下是使用的代码:

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