C中非常简单的加密函数

时间:2017-03-19 07:48:04

标签: c string function hash char

我正在尝试创建一个非常简单的加密函数,它接受一个字符数组并返回另一个字符数组,其值增加一。

准确的解释: 输入是用户插入的一行文本。 我希望数组line例如“abcdef”变成“bcdefg”。 真正发生的是我无法增加每个角色的价值,我不知道该怎么做。 我没有从编译器得到任何错误,只是结果是错误的,我认为问题与strcat有关,但我无法想象如何解决它。

由于我是一名C学生,在答案中我想要修改我的程序,如果有可能的话,不是一个全新的。

#include <stdio.h>
#include <string.h>

char line[20];
char duplicated[20];
char hashed[];

/********************************************************
 * hashf -- Simple hash function that takes a character *
 *          array and returns that takes a character    *
 *          array and returns another character array   *
 *          with its value increased by one.            *
 *                                                      *
 * Parameters -- string duplicated from the text        *
 *               inserted by the user                   *
 *                                                      *
 * Returns -- the hashed array (supposed to...)         *
 ********************************************************/
char hashf(char duplicated[]) {
    hashed[0] = '\0';
    for (int i = 0; duplicated[i] != '\0' ; ++i) {
        duplicated[i] += 1;
        strcat(hashed, duplicated[i]);
    }
    return (hashed);
}

int main() {
    printf("Put a text to hash: ");
    fgets(line, sizeof(line), stdin);

    strcpy(duplicated, line);        // strcpy(string1, string2) -- copy string 2 into string 1

    /* This two line are used to remove the '\n' character from the end of the array */
    duplicated[strlen(duplicated)-1] = '\0';  
    line[strlen(line)-1] = '\0';

    printf("The text %s become %s", line, hashf(duplicated));
}

3 个答案:

答案 0 :(得分:2)

很多错误。

不要忽略编译器警告。

第一次警告

  

警告:假设数组'hashed'有一个元素    char hashed [];

您尚未分配内存,因此将其假设为1 byte;

将其更改为char hashed[40];

第二次警告

  

警告:传递'strcat'的参数2使得整数指针没有强制转换[-Wint-conversion]            strcat(散列,重复[i]);                           ^ ~~~~~~~~~   块引用

     

/usr/include/string.h:133:14:注意:预期'const char * restrict'   但参数的类型为'char'extern char * strcat(char * __ restrict   __dest,const char * __ restrict __src)

strcat包含原型char * strcat ( char * destination, const char * source );

注意第二个参数const char *,这意味着你传递一个地址,它将连接该地址的字符串,直到找到\0,但你传递的是char(不起作用)

第3次警告

  

警告:格式'%s'需要类型为'char *'的参数,但参数3的类型为'int'[-Wformat =]        printf(&#34;文本%s成为%s&#34;,行,hashf(重复));

因为你的函数返回类型是char它应该是char *

总结如下改变你的功能

char* hashf(char duplicated[]) {
    hashed[0] = '\0';
    for (int i = 0; duplicated[i] != '\0' ; ++i) {
        duplicated[i] += 1;
        }
       // strcat(hashed, duplicated); as others suggested no need for this
    //}
    return (duplicated);
}

答案 1 :(得分:0)

哈希应该是单向函数。 (阅读:关于可逆属性的https://en.wikipedia.org/wiki/Hash_function

无论如何,还有一些错误。您想要返回一个数组,但是您使用char。

您必须将char hashf(char duplicated[])更改为char* hashf(char duplicated[])。 (可能这很有用:https://www.tutorialspoint.com/cprogramming/c_pointer_to_an_array.htm

我认为这是实施它的最简洁方法:

char* hashf(char duplicated[]) {
    for (int i = 0; duplicated[i] != '\0' ; ++i) {
        duplicated[i] += 1;
    }
    return duplicated;
}

答案 2 :(得分:0)

您是否有所有编译器错误消息?当我编译时,我得到三条消息,这使我朝着修复它的方向。一个大问题是你处理全局变量的方式。你不需要把它们传遍整个地方。第二,strcpy需要两个指针,你给它一个指针和一个int,我认为这导致了分段错误。无论如何,我为你解决了这个问题:

#include <stdio.h>
#include <string.h>

char line[20];
char duplicated[20];
char hashed[40];

void hashf() {
    for (int i = 0; duplicated[i] != '\0' ; ++i) {
        duplicated[i] += 1;
        hashed[i] = duplicated[i];
    }
}

int main() {
    printf("Put a text to hash: ");
    fgets(line, sizeof(line), stdin);

    strcpy(duplicated, line);      
    duplicated[strlen(duplicated)-1] = '\0';  
    line[strlen(line)-1] = '\0';

    hashf();
    printf("The text %s become %s", line, hashed);
} 

只需考虑一下,z会去做什么;)?它会是你想要的吗?祝你好运?