【发布时间】:2014-07-15 18:05:16
【问题描述】:
我正在创建一个散列程序,它采用文件或标准输入并将散列打印到另一个文件或通过标准输出到终端。我的问题是,由于参数的十六进制值发生了变化,我得到了基于相同标准输入的不同哈希值。
发生这种情况的代码部分在这里:
for (i = 3; i < argc; i++) {
if (strcmp(argv[i], "-i") == 0 && argv[i+1] != NULL) {
in = argv[i+1];
in = strtok(in, " ");
printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1]);
inCheck = 1;
i++;
}
else if (strcmp(argv[i], "-o") == 0 && argv[i+1] != NULL) {
out = argv[i+1];
i++;
}
else
printf("Unknown argument %s. Ignoring.\n", argv[i]);
}
基本上,我在这里检查命令行中“-i”之后输入的十六进制值。当我进入时:
./executable hash -sha -i hello -o world我得到了输出arg "hello" hex: ce4a2823
当我进入时:
./executable hash -sha -i hello 我得到了输出arg "hello" hex: 247f582c
当我进入时:
./executable hash -sha -o world -i hello我得到了输出arg "hello" hex: 57e2f82c
所以我想知道为什么字符串的十六进制值不断变化?
【问题讨论】:
-
由于我们看不到计算散列的代码——或任何支持代码——所以无法判断。你应该准备一个minimal compilable example 来重现问题并发布那个。
-
您打印的十六进制数是内存中字符串的地址。在大多数现代系统上,每次运行程序时该值都会发生变化,即使您为程序提供完全相同的参数也是如此。旁注:
argv数组中的字符串从不包含空格(因为空格是命令行参数之间的分隔符),所以strtok调用保证什么都不做。 -
我向您展示了最小的代码示例。哈希部分稍后出现,正是在这部分中我遇到了问题。这就是我发布我所做的事情的原因。就 strtok 而言,我自己几乎已经想通了,但补充说,在检查为什么事情可能会有所不同时,我在发布之前没有去删除它,但是谢谢,很高兴知道.内存地址是有道理的,这是我怀疑但不完全确定的。所以谢谢你。
-
@user3386109
argv字符串当然可以包含空格。你还能如何(例如)处理带有空格的文件名? -
@hyde 是的,您是对的,您可以使用引号在参数中强制使用空格。但在这种情况下,您不会使用
strtok截断第一个空格处的参数。
标签: c hex command-line-arguments stdin gnome-terminal