我正在尝试创建一个非常简单的加密函数,它接受一个字符数组并返回另一个字符数组,其值增加一。
准确的解释:
输入是用户插入的一行文本。
我希望数组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));
}
答案 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会去做什么;)?它会是你想要的吗?祝你好运?