【问题标题】:Very simple cryptography function in CC中非常简单的密码学功能
【发布时间】:2017-08-10 14:02:16
【问题描述】:

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

准确解释: 输入是用户插入的一行文本。 我希望数组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));
}

【问题讨论】:

  • 您应该启用并注意编译器警告。
  • "我认为问题与strcat有关,[...]" 欢迎来到stackoverflow。 stackoverflow 是这样工作的:你展示你的代码,你准确地解释你给它的输入,你准确地解释发生了什么,你准确地解释你期望发生什么。如果它爆炸了,你准确地解释你得到了什么错误,在哪一行。
  • 如果在调用代码中忽略它,为什么要返回一个指针?
  • @MikeNakis 对不起,你完全正确,我不是故意要问一个乱七八糟的问题。
  • 看起来你正在使用 gcc。请永远不要在没有这些参数的情况下运行 gcc:-Wall -Wextra -Wpedantic -Werror -std=c99(或 -std=c11)。将为您(和我们)节省大量时间。

标签: c string function hash char


【解决方案1】:

很多错误。

不要忽略编译器警告。

第一次警告

警告:数组“散列”假定有一个元素 字符散列[];

你还没有分配内存所以它被假定为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(将不起作用)

第三次警告

警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“int”[-Wformat=] printf("文本%s变成%s", line, hashf(duplicated));

因为你的函数返回类型是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);
}

【讨论】:

    【解决方案2】:

    哈希应该是一种单向函数。 (阅读: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;
    }
    

    【讨论】:

    • 完全正确!非常感谢关于数组指针的文章!
    【解决方案3】:

    您是否打开了所有编译器错误消息?当我编译时,我收到三条消息,这使我朝着修复它的方向前进。一个大问题是你处理全局变量的方式。你不需要到处传递它们。其次, 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 会去哪里 ;) ?会是你想要的吗?祝你好运吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 2013-11-14
      • 2011-05-28
      • 2012-03-15
      • 1970-01-01
      • 2012-09-30
      • 2013-03-06
      • 2011-01-07
      相关资源
      最近更新 更多