【问题标题】:Reading Data from File into Array - C将数据从文件读入数组 - C
【发布时间】:2015-04-26 04:16:14
【问题描述】:

我正在 Kali Linux 上做一个项目,我在其中运行工具 Ettercap,它列出了网络上的 IP 地址并将它们保存到 .txt。然后我需要在另一个工具nmap上使用这些IP,所以我想编写一个可以将IP.txt中的IP保存到数组中的C代码。到目前为止,这是最接近的工作代码:

#include <stdio.h>
#include <stdlib.h>

main(){

    FILE *ipList;
    ipList = fopen("IP.txt", "r");

    int ipArray[10];
    int i;

    if (ipList == NULL)
    {
        printf("Error\n");
        exit (0);
    }
    for (i = 0; i < 10; i++)
    {
        fscanf(ipList, "%d,", &ipArray[i] );

    }

    for (i = 0; i < 10; i++)
    {
           printf("nmap -A -T4 -F %d\n\n", ipArray[i]);
        }

    fclose(ipList);

    return 0;
}

结果输出只是一堆随机数。有任何想法吗?我使用 Kali 重要吗?我的 ipArray 设置为 10;如果我没有 10 个 IP 地址会不会有问题?


IP 地址是这样存储的:

IP地址:10.0.0.1

IP地址:10.0.0.2

IP地址:10.0.0.3

IP地址:10.0.0.4


我已经取得了进步。这是我目前的输出:

nmap -A -T4 -F IP|nnmap -A -T4 -F 地址|nnmap -A -T4 -F :|nnmap -A -T4 -F 10.0.2.2|nnmap -A -T4 -F IP| nnmap -A -T4 -F 地址|nnmap -A -T4 -F :|nnmap -A -T4 -F 10.0.2.3|nnmap -A -T4 -F IP|nnmap -A -T4 -F 地址|nnmap -A -T4 -F :|nnmap -A -T4 -F 10.0.2.4

这是我当前的代码:

#include <stdio.h>

#include <stdlib.h>



main() {



FILE *ipList;
ipList = fopen("IP.txt","r");



char ip_addr[256];



while (fscanf(ipList, "%255s", ip_addr) == 1){

printf("nmap -A -T4 -F %s|n", ip_addr);

}



if (ipList == NULL){

printf("error\n");

exit (1);

}



fclose(ipList);

return 0;

}

所以现在我的目标是让代码忽略“IP 地址:”,并尽可能将其作为列表输出。

【问题讨论】:

  • 您不检查来自fscanf() 的返回值,因此您不知道它是否认为它能够从输入中读取整数。您永远不会知道逗号是否匹配,这可能无关紧要。您的错误消息应该打印在标准错误 (stderr) 上,而不是标准输出上。您的错误退出可能应该是1EXIT_FAILURE 而不是0,这表明成功。您使用 Kali Linux 的事实几乎可以肯定是完全无关紧要的。你的代码完全是标准的 C,除了你应该有一个明确的返回类型:int main()
  • 对于@JonathanLeffler 的评论,我唯一可以补充的是,对于一些不存在的表示 IP 地址的格式说明符(和类型),您似乎对 %d(和 int)感到困惑,并且您可能应该使用%s(对应于char 的数组,而不是指向int 的指针)将此输入作为字符串处理,而不是... char ip_addr[256]; while (fscanf(ipList, "%255s", ip_addr) == 1) { printf("nmap -A -T4 -F %s\n", ip_addr); }
  • @undefinedbehaviour:好点。但是,如果 IP 地址以逗号分隔,则可能需要为 "%255[^,],"
  • 感谢大家的帮助。实际上,在生成 IP 列表时,它是以列表的形式而不是并排或逗号分隔的形式。
  • @JonathanLeffler 沿着这条切线提出一个很好的观点是,"%255[^,]," 在故障模式方面引入了不同的挑战。

标签: c arrays scanf


【解决方案1】:

假设输入格式是如下行:

IP address : 10.0.0.1

那么您需要将地址读取为字符串,或 4 个单独的小整数。

char *ip_address[16];

for (i = 0; i < 10; i++)
{
    if (fscanf(fp, "IP address : %15s", ip_address) != 1)
        …report format error…
    …code to convert dotted-decimal to IPv4 address…
}

或:

int ip[4];

for (i = 0; i < 10; i++)
{
    if (fscanf(fp, "IP address : %d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) != 4)
        …report format error…
    for (j = 0; j < 4; j++)
    {
        if (ip[j] < 0 || ip[j] > 255)
            …report bogus value…
    }
    …convert dotted-decimal values into IPv4 address…
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2012-12-05
    • 2013-12-10
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多