从C中的文本文件中读取IP地址

时间:2015-02-20 09:50:28

标签: c file segmentation-fault scanf

我有一个包含IP地址的文本文件(IP_CONFIG.txt)

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)

任何人都可以告诉我为什么会收到此错误,我该如何解决?

2 个答案:

答案 0 :(得分:1)

分段错误的原因是访问越界内存。定义为

#define ROW 11
#define COL 2

unsigned char ip_list[ROW][COL];

使用

&ip_list[0][2]
由于off-by-one错误,

无效。索引从0开始,因此此处没有第3个元素。

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

然后,使用fscanf()是错误的。

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

修复:

更好的方法是

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

答案 1 :(得分:1)

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