如何从C中的字符串中获取子字符串?

时间:2014-05-22 14:36:36

标签: c string encryption passwords md5

MD5加密密码为$1$12345678$blahblahblah。盐是两个$标志之后的8位数字键。我如何提取那些8?

到目前为止,我有char *salt =,我需要使它等于字符串的第十个索引。

1 个答案:

答案 0 :(得分:0)

您的问题包含"提取"这有点复杂,因为不清楚是否要将这8个字符复制到新的缓冲区中,或者如果您想要做其他事情。

我可以想象,或许您只想将这8个字符显示给控制台用户。以下代码实现了这一点(但可能需要一些解释):

char *salt = "$1$12345678$blahblahblah";
int from = 3;
int to = 10;
int len = to-from+1;
printf("%.*s\n", len, salt+from);

Printf()及其变体具有一些非常强大的字符串生成/操作功能。在这种情况下,我使用了"精度"说明符作为“'”的参数提供。转换。如果给出了一个精确度的精确度。转换是为了限制发出的字符数。我用过' len'通过' *'字符以参数化方式提供此限制。如果你知道你总是要从第3个开始想要发出8个字符(在C中我们总是从0开始计数而不是从1开始),那么你的代码可以简化为下面给出的更简单的形式:

char *salt = "$1$12345678$blahblahblah";
printf("%.8s\n", salt+3);

最后,sprintf可用于复制到另一个缓冲区。我将在下面给出一个简单的此任务形式(请注意,为了清楚起见,我更改了变量名称;您从一行密码文本中提取盐):

char *password = "$1$12345678$blahblahblah";
char salt[9]; /* Size of 9 required to hold terminating NULL byte */
sprintf(salt, "%.8s\n", password+3);

/* Now you can use salt for various purposes */
printf ("The salt is %s\n", salt);