crypt(将密码或数据编码)
相关函数: getpass
表头文件: #include "unistd.h"
定义函数: char *crypt(const char *key, const char *salt);
函数说明 crypt()将使用Data Encryption Standard(DES)演算法将参数key所指的字符串加以编码,key字符串长度仅取前8个字符,超过此长度的字符没有意义。参数salt为两个字符组成的字符串,由a-z、A-Z、0-9,"."和"/"所组成,用来决定使用4096种不同内建表格的哪一个。函数执行成功后会返回指向编码过的字符串指针,参数key所指的字符串不会有所更动。编码过的字符串长度为13 个字符,前两个字符为参数salt代表的字符串。
返回值: 返回一个指向以NULL结尾的密码字符串。
附加说明: 使用GCC编译时需加-lcrypt。
范例
#include "unistd.h"
#include "crypt.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char const *argv[])
{
char passwd[13];
char *key;
char salt[2];
key = getpass("Input First Password: ");
salt[0] = key[0];
salt[1] = key[1];
strcpy(passwd, crypt(key, salt));
key = getpass("Input Second Password: ");
salt[0] = passwd[0];
salt[1] = passwd[1];
printf("After crypt(), 1st passwd: %s\n", passwd);
printf("After crypt(), 2nd passwd: %s\n", crypt(key, salt));
return 0;
}
执行结果
/*结果和输入有关*/
Input First Password:
Input Second Password:
After crypt(), 1st passwd: ad6hWjRogGvo6
After crypt(), 2nd passwd: ad4V/BWJ5q94Q
search(二元搜索)
相关函数: qsort
表头文件: #include "stdlib.h"
定义函数: void *bsearch(const void *key, const void *base, size_t nmemb, size_tsize, int (*compar) (const void*, const void*));
函数说明 bsearch()利用二元搜索从排序好的数组中查找数据。参数key指向欲查找的关键数据,参数base指向要被搜索的数组开头地址,参数nmemb代表数组中的元素数量,每一元素的大小则由参数size决定,最后一项参数compar为一函数指针,这个函数用来判断两个元素之间的大小关系,若传给compar的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于0的值,两个元素数据相等则回传0。
附加说明: 找到关键数据则返回找到的地址,如果在数组中找不到关键数据则返回NULL。
范例
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define NMEMB 5
#define SIZE 10
int compar(const void *a, const void *b)
{
return (strcmp((char *)a, (char *)b));
}
int main(int argc, char const *argv[])
{
char data[50][SIZE] = {"linux", "freebsd", "solaris", "sunos", "windows"};
char key[80], *base , *offset;
int i, nmemb = NMEMB, size = SIZE;
while(1)
{
printf("please input the word you will find:\n");
fgets(key, sizeof(key), stdin);
key[strlen(key)-1] = '\0';
if(!strcmp(key, "exit"))break;
if(!strcmp(key, "list"))
{
for (i = 0; i < nmemb; i++)
printf("%s\n", data[i]);
continue;
}
base = data[0];
qsort(base, nmemb, size, compar);
offset = (char *) bsearch(key, base, nmemb, size, compar);
if( offset == NULL)
{
printf("%s not found!\n", key);
strcpy(data[nmemb++], key);
printf("Add %s to data array\n", key);
}
else
{
printf("found: %s \n", offset);
}
}
return 0;
}
换行结果
/*自行输入字符串测试*/
lfind(线性搜索)
相关函数: lsearch
表头文件: #include "stdlib.h"
定义函数: void *lfind (const void *key, const void *base, size_t *nmemb, size_t size, int (_USERENTRY *compare)(const void *, const void *));
函数说明 lfind()利用线性搜索在数组中从头至尾一项项查找数据。参数key指向欲查找的关键数据,参数base指向要被搜索的数组开头地址,参数nmemb代表数组中的元素数量, 每一元素的大小则由参数size决定,最后一项参数compare为一函数指针,这个函数用来判断两个元素是否相同, 若传给compare的第一个参数所指的元素数据和第二个参数所指的元素数据相同时则返回0,两个元素数据不相同则返回非0值。 lfind()与lsearch()不同点在于,当找不到关键数据时lfind()仅会返回NULL,而不会主动把该笔数据加入数组尾端。
返回值: 找到关键数据则返回找到的该笔元素的地址,如果在数组中找不到关键数据则返回空指针(NULL)。
范例
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int compare(int *x, int *y)
{
return ( *x - *y );
}
int main(int argc, char const *argv[])
{
int array[5] = {35, 87, 46, 99, 12};
size_t nelem = NMEMB;
int key = 99;
int *result;
int *offset;
offset = (int *) lfind(&key, array, &nelem, sizeof(int),
(int(*)(const void *, const void *))compare);
if (offset)
printf("Number %d found\n", key);
else
printf("Number %d not found\n", key);
return 0;
}
执行结果
Number 99 found
lsearch(线性搜索)
相关函数: lfind
表头文件: #include "stdlib.h"
定义函数: void *lsearch(const void * key, const void * base, size_t *nmemb, size_t size, int (_USERENTRY *compare)(const void *, const void *));
函数说明 lsearch()利用线性搜索在数组中从头至尾一项项查找数据。参数key指向欲查找的关键数据,参数base指向要被搜索的数组开头地址,参数nmemb代表数组中的元素数量,每一元素的大小则由参数size决定,最后一项参数compare为一函数指针,这个函数用来判断两个元素是否相同,若传给compare的第一个参数所指的元素数据和第二个参数所指的元素数据相同时则返回0,两个元素数据不相同则返回非0值。如果lsearch()找不到关键数据时会主动把该项数据加入数组里。
返回值: 找到关键数据则返回找到的该笔元素的四肢,如果在数组中找不到关键数据则将此关键数据加入数组,再把加入数组后的地址返回。
qsort(利用快速排序法排列数组)
相关函数: bsearch
表头文件: #include "stdlib.h"
定义函数: void qsort(void * base, size_t nmemb, size_t size, int (_USERENTRY *compare)(const void *, const void *));
函数说明 参数base指向欲排序的数组开头地址,参数nmemb代表数组中的元素数量,每一元素的大小则由参数size决定,最后一项参数compare为一函数指针,这个函数用来判断两个元素间的大小关系,若传给compare的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于零的值,两个元素数据相等则回传0。
返回值:
范例
#define NMEMB 7
#include "stdlib.h"
#include "stdio.h"
int compar(const void *a , const void *b)
{
int *aa = (int *) a, *bb = (int *)b;
int result;
if(*aa < *bb)
result = 1;
else if(*aa == *bb)
result = 0;
else
result = -1;
return result;
}
int main(int argc, char const *argv[])
{
int base[NMEMB] = { 3, 102, 5, -2, 98, 52, 18};
int nmemb = NMEMB;
int i;
for( i = 0; i < nmemb; i++)
printf("%d ", base[i]);
printf("\n");
qsort(base, nmemb, sizeof(int), compar);
for(i = 0; i < nmemb; i++)
printf("%d ", base[i]);
printf("\n");
return 0;
}
执行结果
3 102 5 -2 98 52 18
102 98 52 18 5 3 -2
rand(产生随机数)
表头文件: #include "stdlib.h"
定义函数: int rand(void)
函数说明 rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。
返回值: 返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,其值为2147483647。 范例 /* 产生介于1 到10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考srand()*/
范例
#include "stdlib.h"
#include "stdio.h"
int main(int argc, char const *argv[])
{
int i, j;
for(i = 0; i < 10; i++)
{
j = 1 + (int)(10.0 * rand()/(RAND_MAX + 1.0));
printf("%d ", j);
}
return 0;
}
执行结果
9 4 8 8 10 2 4 8 3 6
srand(设置随机数种子)
表头文件: #include "stdlib.h"
定义函数: void srand (unsigned int seed);
函数说明 srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的
返回值:来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
范例
/* 产生介于1 到10 间的随机数值,此范例与执行结果可与rand()参照*/
#include "time.h"
#include "stdlib.h"
#include "stdio.h"
int main(int argc, char const *argv[])
{
int i, j;
srand((int)time(0));
for (i = 0; i < 10; i++)
{
j = 1 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
printf(" %d ", j);
}
return 0;
}
执行结果
5 10 3 4 7 1 5 1 6 2