Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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 wprintf是否会导致;条件跳转或移动取决于未初始化的值;在瓦尔格林?_C_Valgrind - Fatal编程技术网

C wprintf是否会导致;条件跳转或移动取决于未初始化的值;在瓦尔格林?

C wprintf是否会导致;条件跳转或移动取决于未初始化的值;在瓦尔格林?,c,valgrind,C,Valgrind,我试图编写函数来解决以下问题(这是不相关的,我描述它是为了描述下面的代码): 在“lhs->rhs”格式中给定一个单词和一条规则,其中word=lhs^后缀,输出rhs^后缀,例如: 如果一个单词是“input”,而一个规则是“in->out”,则函数将返回单词“output”,如果该规则不能用于该单词,则返回NULL 不过有一个转折:“lhs”可能还包含数字变量(除了字母),例如。G“01->10”,在这种情况下,当在“niput”上使用时,该规则将“niput”转换为“input”(因此数字

我试图编写函数来解决以下问题(这是不相关的,我描述它是为了描述下面的代码):

在“lhs->rhs”格式中给定一个单词和一条规则,其中word=lhs^后缀,输出rhs^后缀,例如:

如果一个单词是“input”,而一个规则是“in->out”,则函数将返回单词“output”,如果该规则不能用于该单词,则返回NULL

不过有一个转折:“lhs”可能还包含数字变量(除了字母),例如。G“01->10”,在这种情况下,当在“niput”上使用时,该规则将“niput”转换为“input”(因此数字对应于某些位置的字母)

代码如下:

#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>

#define MAX_WORD_SIZE 101

wchar_t *transform_by_rule(wchar_t *word, wchar_t *lhs, wchar_t *rhs)
{
    int i;
    long int wint;
    int lhs_len = wcslen(lhs);
    int rhs_len = wcslen(rhs);
    int word_len = wcslen(word);

    // Initial check - does lhs fit to word
    if (word_len < lhs_len)
        return NULL;
    for (i = 0; i < lhs_len; i++)
    {
        if (iswdigit(lhs[i]))
            continue;
        else
        {
            if (lhs[i] != word[i])
                return NULL;
        }
    }

    wchar_t *result =
        malloc((rhs_len + 1) * sizeof(wchar_t));
    wchar_t int_wchar_map[10];
    for (i = 0; i < lhs_len; i++)
    {
        if (iswdigit(lhs[i]))
        {
            wint = lhs[i] - L'0';
            int_wchar_map[wint] = word[i];
        }
    }
    for (i = 0; i < rhs_len; i++)
    {
        if (iswdigit(rhs[i]))
        {
            wint = rhs[i] - L'0';
            result[i] = int_wchar_map[wint];
        }
        else
        {
            result[i] = rhs[i];
        }
    }
    return result;
}


int main()
{
    wchar_t word[MAX_WORD_SIZE];
    wchar_t lhs[MAX_WORD_SIZE];
    wchar_t rhs[MAX_WORD_SIZE];
    wscanf(L"%ls", word);
    wscanf(L"%ls", lhs);
    wscanf(L"%ls", rhs);
    wchar_t *result = transform_by_rule(word, lhs, rhs);
    if (result != NULL)
    {
        wprintf(L"%ls\n", result); // line 67
        free(result);
    }
    else
    {
        puts("Rule doesn't fit to word.");
    }
    return 0;
}

我看我的代码没有任何问题。这是wprintf()的问题吗?

结果在从
transform\u by\u rule()
返回之前不是以零结尾的。因此,当对其返回值调用
wprintf()
时,
wprintf()
可能会读取超出范围,因为它可能不会在分配的内存块中遇到终止宽字符


使用
wchar\u t*result=calloc(rhs\u len+1,sizeof(wchar\u t)),并且如果您确定未在
transform\u by\u rule()

中写入边界,则会自动获得正确终止的字符串。通常情况下,可以使用calloc()来解决此警告
==6094== Conditional jump or move depends on uninitialised value(s)
==6094==    at 0x4C30E19: wcslen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6094==    by 0x4E8C3F6: vfwprintf (in /usr/lib64/libc-2.20.so)
==6094==    by 0x4EA7448: wprintf (in /usr/lib64/libc-2.20.so)
==6094==    by 0x4009AA: main (main.c:67)