使用 fgets 从文件流中将字符串读入 char 数组。 [C]
Reading a string with fgets into a char array from a filestream. [C]
我正在尝试编写一个程序来解密文件中的一系列字母。
可悲的是,我无法将字母读入 char 数组(字符串),因为我真的不知道 fgets() 函数是如何工作的。
所以我的实际代码如下所示:
#define stringlength 80
int main(void)
{
FILE *source;
char puffer[stringlength], name[20];
printf("Which file do you want to read: ");
scanf("%s",name);
if( (source=fopen(name,"r")) == NULL)
{
fprintf(stderr, "Can not open %s\n", name);
return EXIT_FAILURE;
}
while(fgets(puffer, stringlength, source))
{
fputs(puffer, stdout);
}
return EXIT_SUCCESS;
}
所以实际上这有点管用。它打开命令提示符并在 window 中写入字母序列。
但现在我必须使用每一个字母并将其与钥匙的字母进行比较。
它只是将正确的四位与异或进行比较,以使结果字母保持在 ASCII 图表的同一列中。
我已经编写了一个适用于单个字母的算法:
saveLeftFourBits = letterOfFile >> 4;
saveLeftFourBits = saveLeftFourBits << 4;
letterOfFile = letterOfFile & 0x0F;
letterOfKey = letterOfKey & 0x0F;
temp = letterOfFile ^ letterOfKey;
temp |= saveLeftFourBits;
temp 应该是生成的字母。
所以现在我正在努力研究如何从 fgets 函数中读取单个字母到变量(在 letterOfFile 中)并将其与 letterOfKey 进行比较。
或者是否有一个字符串函数可以更容易地做到这一点?
我希望有一个人可以帮助我。 :)
程序没问题。
然而,移动和掩蔽对我来说看起来很可疑。我认为您已经迷上了二进制和十六进制之间的常见混淆。二进制数是本机表示整数的格式,按位运算符仅对它们有意义。十六进制数是 ASCII 字符串,如 "F2E0",第一个字符是 "F",如 "Fred",需要将其视为文本。你可以写一个小函数来获取一个字符和 return 一个数字 0-15,或者 -1 出错(传递一个像 "K" 这样没有十六进制值的字母”)。
像这样
int hextobinary(char hex)
{
/* logic here */
}
int hexstringtobinary(char *hexstr)
{
int i;
int answer = 0;
for(i=0;hextr[i] != '[=10=]';i+++)
{
answer *= 16;
answer += hextobinary(hexstr[i]);
}
return answer;
}
作为练习,如果传递的字符串中包含非十六进制字符,请加入错误处理。
puffer
是 fgets
存储一行最多 80 个字符的位置,包括(如果大小允许)尾随的 \n
.
要处理一行中的所有字符,请从 puffer
开始循环,直到到达行尾,即 [=15=]
或 \n
char letterOfKey = '#'; // Define it
char *s;
for(s=puffer ; *s && *s != '\n' ; s++) {
*s = (*s & 0xF0) | ((*s ^ letterOfKey) & 0x0F);
}
fputs(puffer, stdout);
说明
s
指向puffer
的开头,并递增。当 s
指向的字符是 0
或 \n
时,循环结束。对于行中的每个字符 *s
,按位运算完成并存储回 *s
。而且,
(*s & 0xF0)
保留 4 MSb
|
是按位或
(*s ^ letterOfKey)
在两个操作数之间进行异或运算
& 0x0F
保留 4 LSb
我正在尝试编写一个程序来解密文件中的一系列字母。 可悲的是,我无法将字母读入 char 数组(字符串),因为我真的不知道 fgets() 函数是如何工作的。 所以我的实际代码如下所示:
#define stringlength 80
int main(void)
{
FILE *source;
char puffer[stringlength], name[20];
printf("Which file do you want to read: ");
scanf("%s",name);
if( (source=fopen(name,"r")) == NULL)
{
fprintf(stderr, "Can not open %s\n", name);
return EXIT_FAILURE;
}
while(fgets(puffer, stringlength, source))
{
fputs(puffer, stdout);
}
return EXIT_SUCCESS;
}
所以实际上这有点管用。它打开命令提示符并在 window 中写入字母序列。 但现在我必须使用每一个字母并将其与钥匙的字母进行比较。 它只是将正确的四位与异或进行比较,以使结果字母保持在 ASCII 图表的同一列中。 我已经编写了一个适用于单个字母的算法:
saveLeftFourBits = letterOfFile >> 4;
saveLeftFourBits = saveLeftFourBits << 4;
letterOfFile = letterOfFile & 0x0F;
letterOfKey = letterOfKey & 0x0F;
temp = letterOfFile ^ letterOfKey;
temp |= saveLeftFourBits;
temp 应该是生成的字母。 所以现在我正在努力研究如何从 fgets 函数中读取单个字母到变量(在 letterOfFile 中)并将其与 letterOfKey 进行比较。 或者是否有一个字符串函数可以更容易地做到这一点? 我希望有一个人可以帮助我。 :)
程序没问题。 然而,移动和掩蔽对我来说看起来很可疑。我认为您已经迷上了二进制和十六进制之间的常见混淆。二进制数是本机表示整数的格式,按位运算符仅对它们有意义。十六进制数是 ASCII 字符串,如 "F2E0",第一个字符是 "F",如 "Fred",需要将其视为文本。你可以写一个小函数来获取一个字符和 return 一个数字 0-15,或者 -1 出错(传递一个像 "K" 这样没有十六进制值的字母”)。
像这样
int hextobinary(char hex)
{
/* logic here */
}
int hexstringtobinary(char *hexstr)
{
int i;
int answer = 0;
for(i=0;hextr[i] != '[=10=]';i+++)
{
answer *= 16;
answer += hextobinary(hexstr[i]);
}
return answer;
}
作为练习,如果传递的字符串中包含非十六进制字符,请加入错误处理。
puffer
是 fgets
存储一行最多 80 个字符的位置,包括(如果大小允许)尾随的 \n
.
要处理一行中的所有字符,请从 puffer
开始循环,直到到达行尾,即 [=15=]
或 \n
char letterOfKey = '#'; // Define it
char *s;
for(s=puffer ; *s && *s != '\n' ; s++) {
*s = (*s & 0xF0) | ((*s ^ letterOfKey) & 0x0F);
}
fputs(puffer, stdout);
说明
s
指向puffer
的开头,并递增。当 s
指向的字符是 0
或 \n
时,循环结束。对于行中的每个字符 *s
,按位运算完成并存储回 *s
。而且,
(*s & 0xF0)
保留 4 MSb|
是按位或(*s ^ letterOfKey)
在两个操作数之间进行异或运算& 0x0F
保留 4 LSb