我正在尝试模拟DNS服务器的行为,我有一个名为hosts.txt
的数据库,其中包含machine_names/IP_addresses
,例如:
equipo_00/169.0.1.169
sala_oeste_01/200.1.2.200
sala_oeste_02/200.2.3.200
sala_oeste_03/200.3.4.200
MEMFIS_04/201.4.5.201
ICARO_05/200.5.6.200
equipo_06/169.6.7.169
sala_este_07/201.7.8.201
sala_este_08/201.8.9.201
CEC_09/189.9.10.189
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char* machine, *ip_add;
FILE* db;
char* flag;
char tmp[256];
char par[256];
printf("> ");
scanf("%s", par);
db = fopen("hosts.txt", "r");
while(db != NULL && fgets(tmp, sizeof(tmp), db) != NULL)
{
if(strstr(tmp, par))
{
flag = "1"; // flag setting to 1 means find the line
machine = strtok(tmp, "/");//here's supposed to get the value of the machine
ip_add = strtok(NULL, "/");//here's supposed to get the value of the ip adress
}
}//while
if(strcmp(flag, "1") == 0) //
{
printf("here\n");
}
else
{
flag = "0"; //flag setting to 0
printf("there\n");
}
printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
return 0;
}
我的代码从标准输入读取机器的值,并指示在服务器上分配给该机器的IP地址。问题是该程序不是正常行为,我不知道如何将我的代码修改为预期的输出,例如
input: equipo_00
output: flag = 1 pc = equipo_00 server=169.0.1.169
对不起,如果问题相当愚蠢,我是这种语言的新手..谢谢大家的帮助,请原谅我的英语
答案 0 :(得分:4)
这就是你要做的:
将文件中的字符串读入tmp
。
检查par
中是否存在用户输入的字符串tmp
。
如果是,您继续并tmp
/
上machine
,并将指针ip_add
指向第一部分,machine
指向下一部分。
请注意,ip_add
和tmp
只是指针。他们指出tmp
的各种指数。所以稍后当你继续循环时,你会再次将新字符串读入 if (strstr(tmp, par)) {
flag = "1";
machine = strtok(tmp, "/");
ip_add = strtok(NULL, "/");
break;
}
,覆盖它。这会导致问题,您的指针现在指向更改的字符串。
为避免这种情况,只需在成功匹配后添加休息时间:
printf
也是你的最终printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
:
if
应该是server
正文的一部分,以便只有在找到匹配项后才打印它们。
目前即使找不到匹配项也要打印。在这种情况下,您将打印垃圾,因为您的指针ip_add
和{{1}} 尚未初始化。
答案 1 :(得分:0)
您的问题可能与flag
变量有关。使用字符串作为标志值似乎很不寻常。试试这个:
int flag = 0; // always initialise your variables
if (strstr(tmp, par) == 0) {
flag = 1; // just an integer value
}
if (flag) { // easier to test the value too!
// ...
}
printf("flag=%d\n", flag); // ints use %d format value
在上面的代码中,flag
变量在函数开头未初始化,不会产生意外(和未定义)结果。
答案 2 :(得分:0)
以下是固定代码。有几个小错误,大多数缺少inits。想想如果找不到机器会发生什么。
主要的一点是你为循环的每次迭代使用相同的缓冲区,从而清除以前找到的服务器。我通过退出循环来修复它。另一种方法是将找到的结果复制到另一个缓冲区中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char* machine = "";
char* ip_add = "";
FILE* db;
char* flag;
char tmp[256];
char par[256];
printf("> ");
scanf("%s", par);
db = fopen("hosts.txt", "r");
while(db != NULL && fgets(tmp, sizeof(tmp), db) != NULL)
{
char * found = strstr(tmp, par);
if(found)
{
flag = "1"; // flag setting to 1 means find the line
machine = strtok(found, "/");//here's supposed to get the value of the machine
ip_add = strtok(NULL, "/");//here's supposed to get the value of the ip adress
break;
}
}//while
if(strcmp(flag, "1") == 0)
{
flag = "0"; //flag setting to 0
}
printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
return 0;
}
答案 3 :(得分:0)
if(strcmp(flag, "1") == 0)
你不能检查这个,因为如果标志没有初始化它是未定义的行为
strcmp()在两个参数
中搜索'\ 0'字符