【问题标题】:Read IP address from a text file in C从 C 中的文本文件中读取 IP 地址
【发布时间】:2015-02-20 09:50:27
【问题描述】:

我有一个文本文件 (IP_CONFIG.txt),其中包含这样的 IP 地址

CS  192.168.128.3
PORT    1111

我想用一个参数在我的 C 代码的文本文件中读取提到的 IP。我的代码是这样的

<<header files>>
#define ROW 11
#define COL 2

int main(int argc,char **argv)
{
    FILE *f = fopen("IP_CONFIG.txt", "r");
    unsigned char IP_CS;
    int PORT_CS;
    unsigned char ip_list[ROW][COL];

    IP_CS = fscanf(f,"%s",&ip_list[0][2]);
    PORT_CS =  fscanf(f,"%d",&ip_list[1][2]);

    // I use this values in my program for configuring the server address
    bzero(&(server_addr.sin_zero),sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT_CS);
    server_addr.sin_addr.s_addr =  inet_addr("IP_CS");

    while(1)

    {
    //basic socket functions
    }

}

这里的程序正在编译,没有任何错误,但是当我执行程序时它显示

Segmentation fault (core dumped)

谁能告诉我为什么会收到此错误以及如何解决?

【问题讨论】:

  • 为什么要将fscanf 的结果分配给IP_CSPORT_CSfscanf 返回它读取的项目数。
  • inet_addr("IP_CS") 应该做什么? inet_addr() 的参数应该是像 192.168.128.3 这样的地址。由于您将IP_CS 放在引号中,因此它只是一个字符串,而不是变量。
  • 为什么在尝试使用 fopen() 访问文件之前不检查它的结果?
  • 您使用 IDE 吗?如果不是,为什么不呢?如果这样做,请在这个非常小的代码的开头设置一个断点,并逐行遍历它。当您到达段错误的行时,应该很明显出了什么问题(并且您可以检查变量的值并看到其中一个为 NULL)。在那里,它教你如何钓鱼。如果您已经是新手,您很可能不需要在此处发布问题。

标签: c file segmentation-fault scanf


【解决方案1】:

您正在尝试将字符串读入字符元素,即ip_list[0][2]

【讨论】:

    【解决方案2】:

    分段错误的原因是访问超出范围的内存。有一个定义

    #define ROW 11
    #define COL 2
    
    unsigned char ip_list[ROW][COL];
    

    使用

    &ip_list[0][2]
    

    由于off-by-one 错误而无效。索引从0 开始,因此这里没有第三个元素。

    此外,在使用返回的指针之前,请始终检查 fopen() 的返回值。

    那么,fscanf() 的用法是错误的。

    接下来,inet_addr("IP_CS"); 我真的不知道这是做什么的。

    修复:

    更好的方法是

    1. 使用fgets()从文件中读取一个完整的行
    2. 基于分隔符空间进行标记(根据您的需要更改)。
    3. 将反映 IP 地址的令牌值复制到 char 数组中。
    4. 在端口号的情况下将令牌转换为int并放入另一个变量。
    5. 使用它们填充server_addr

    【讨论】:

    • 他的程序还有很多其他问题。祝你一切顺利。
    • @Barmar 你说的很对,但我想指出分段错误的主要问题。 :-)
    • @SouravGhosh 你能看看我更新的答案吗!并检查问题??谢谢
    • @Barmar 感谢您的快速专业回答。欣赏
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多