我是C的新手,目前我正在编写一个允许用户搜索文本文件中写入的哈希的程序。我提出了以下计划:
HashMatch.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//Declaring Functions
int searchstringinfile(char *string, char *filename);
void UsageInfo(char *filename);
//Display usage info on arguements for program
void UsageInfo(char *filename) {
printf("Usage: %s <file> <string>\n", filename);
}
int searchstringinfile(char *filename, char *string) {
//Define File
FILE *userfile;
int linenumber = 1;
int search_result = 0;
char temp[10000];
//Error handling for invalid file
if((userfile = fopen(filename, "r")) == NULL) {
return(-1);
}
//Matching words line-by-line
while(fgets(temp, 10000, userfile) != NULL) {
if((strstr(temp, string)) != NULL) {
//Display line in which matched word is found
printf("A match found on line: %d\n", linenumber);
printf("\n%s\n", temp);
search_result++;
}
linenumber++;
}
// Display message if no matches are found
if(search_result == 0) {
printf("\nSorry, couldn't find a match.\n");
}
//Closes the file.
if(userfile) {
fclose(userfile);
}
return(0);
}
//main function.
int main(int argc, char *argv[]) {
int result, errcode;
//Display format for user to enter arguements and
//End program if user does not enter exactly 3 arguements
if(argc < 3 || argc > 3) {
UsageInfo(argv[0]);
exit(1);
}
system("cls");
//Pass command line arguements into searchstringinfile
result = searchstringinfile(argv[1], argv[2]);
//Display error message
if(result == -1) {
perror("Error");
printf("Error number = %d\n", errcode);
exit(1);
}
return(0);
}
我还提出了一个包含一个字符串和一个哈希的文件:
Hashtext.txt
$1$$t8TX0OHN6Wsx6vlPZNKik1
Ice-Cream
I SCREAM FOR Ice-Cream !
如果我要搜索冰淇淋这个词:
./test hashtext Ice-Cream
我能找到包含所述单词的行:
A match found on line: 2
Ice-Cream
A match found on line: 3
I SCREAM FOR Ice-Cream !
但是,如果我要在文本中搜索哈希值,我无法这样做。 任何人都可以告诉我为什么我无法搜索哈希并指导我完成允许我这样做的步骤?
谢谢。
答案 0 :(得分:0)
从评论中您似乎同意您的命令行有$,您不需要在代码中处理它,而是在从shell传递它时,您需要将它们转义为:
./test hashtext \$1\$\$t8TX0OHN6Wsx6vlPZNKik1
答案 1 :(得分:0)
你的哈希字符串里面有'$'。 Bash认为它是一个特殊的角色。需要转义特殊字符才能删除这些字符的特殊含义。
根据具体情况,您可以执行以下任一操作来处理它们:
\
逐个转义特殊字符。您的输入字符串看起来像\$1\$\$t8TX0OHN6Wsx6vlPZNKik1
。'
转义整个字符串中的特殊字符。您的输入字符串看起来像'$1$$t8TX0OHN6Wsx6vlPZNKik1'
。stdin
加载字符串。但是,您需要为此编辑程序。你不需要逃避角色。以下是bash中许多特殊字符的完整列表:https://docstore.mik.ua/orelly/unix/upt/ch08_19.htm