0

这是我在 stackoverflow 上的第一篇文章,我希望我没有违反任何规则或重新发布。我一直在寻找我的警告的答案。虽然我可以找到一些类似的实例,但我无法得到有效的修复。我希望能得到一些帮助。

我需要找到与 hashfunction(myname) 的哈希冲突。所以我做了一些研究并将这个递归函数放在一起,它将测试每个可能的字符串到指定的长度并在找到字符串时打印它。看一看。

void findCollision(char prefix[], int max_length);

int main() {
    printf("Finding collison\n");
    char blank[0] = {'a'};
    findCollision(blank,999);
    printf("Press Enter to Continue");
    while( getchar() != '\n' );
    return 0;
}

void findCollision(char prefix[], int max_length){
    char c;
    char temp[sizeof(prefix)+1];
    for(c = 'a'; c <= 'z'; c++){
        strcpy(temp, prefix);
        strcat(temp, c);
        if(hashFunction(temp) == -408228925 && temp != 'myname'){
            printf("found it! --->");
            printf("%s", temp);
        }
    }
    for(c = 'a'; c <= 'z'; c++){
        strcpy(temp, prefix);
        strcat(temp, c);
        if(sizeof(prefix) < max_length){
            findCollision(temp, max_length);
        }
    }
}  

当使用哈希码编译时(如果需要,我也可以提供)我得到这些错误。

----------Build Started--------
----------Building project:[ hash - Debug ]----------
/home/mustbelucky/hash/hash.c
22:2: warning: excess elements in array initializer [enabled by default]
22:2: warning: (near initialization for ‘blank’) [enabled by default]
34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]
/usr/include/string.h
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
/home/mustbelucky/hash/hash.c
35:50: warning: character constant too long for its type [enabled by default]
35:47: warning: comparison between pointer and integer [enabled by default]    
42:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]   
/usr/include/string.h
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’

----------Build Ended----------

我已经用谷歌搜索了它们,但没有成功找到成功的修复程序。有什么想法吗?这个项目将在 2 天内到期,我感觉它必须运行一段时间。

4

2 回答 2

2

char blank[0] = {'a'};

声明一个长度为零的字符数组,但你用长度为 1 的数组填充它

strcat(temp, c);

尝试 cat temp,它是一个 char[] 到 c,它是一个 char。两个参数都应该是 char* 或 char[]

我认为除了您提供的代码段之外,还报告了其他错误。

编辑:

temp != 'myname'

似乎正在尝试测试是否temp匹配'myname',但'myname'它是一个字符文字(如果这甚至编译它可能是'm',并且 temp 是一个 char [],你想使用strcmp(temp, "myname") != 0

于 2012-11-30T17:27:18.730 回答
0

这里的警告实际上是不言自明的。

22:2: warning: excess elements in array initializer [enabled by default]

这意味着您在数组中放置的元素比您腾出的空间要多。

34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default]

这意味着第二个参数应该是一个指针,但你给它一个 char/int。

其他警告似乎来自其他代码。

您的段错误的至少一个原因是因为sizeof不会在这里做您想做的事情。

于 2012-11-30T17:29:57.250 回答