Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言从文本文件中读取IP地址_C_File_Segmentation Fault_Scanf - Fatal编程技术网

用C语言从文本文件中读取IP地址

用C语言从文本文件中读取IP地址,c,file,segmentation-fault,scanf,C,File,Segmentation Fault,Scanf,我有一个文本文件(IP_CONFIG.txt),其中包含如下IP地址 CS 192.168.128.3 PORT 1111 <<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; un

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

CS  192.168.128.3
PORT    1111
<<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
    }

}
我想在我的C代码中用一个参数读取文本文件中提到的IP。我的代码如下所示

CS  192.168.128.3
PORT    1111
<<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
    }

}

有人能告诉我为什么会出现此错误,以及如何解决它吗?

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

#define ROW 11
#define COL 2

unsigned char ip_list[ROW][COL];
使用

&ip_list[0][2]
由于错误而无效。索引从
0
开始,因此这里没有第三个元素

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

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

接下来,
inet_addr(“IP_CS”)
修复:

更好的方法是

  • 使用
    fgets()
  • 基于分隔符空间标记(根据需要更改)
  • 将反映IP地址的令牌值复制到
    char
    数组
  • 在端口号的情况下,将令牌转换为
    int
    ,并放入另一个变量
  • 使用它们填充
    server\u addr

  • 您正在尝试将字符串读入字符元素,即
    ip_列表[0][2]

    为什么要将
    fscanf
    的结果分配给
    ip_CS
    端口_CS
    fscanf
    返回它读取的项目数。
    inet\u addr(“IP\u CS”)
    应该做什么?
    inet\u addr()
    的参数应该是类似于
    192.168.128.3
    的地址。既然您将
    IP_CS
    放在引号中,它只是一个字符串,而不是一个变量。为什么在尝试使用fopen()访问文件之前不检查它的结果?您使用IDE吗?若否,原因为何?如果这样做,请在这段非常小的代码的开头设置一个断点,然后逐行遍历它。当您到达segfaults所在的行时,应该很明显什么是错误的(并且您可以检查变量的值并查看其中一个为NULL)。好了,这教会了你如何钓鱼。如果你已经是新手,你很可能不需要在这里发帖。他的程序还有很多其他问题。祝你解释得顺利。@Barmar你说得很对,但我想指出分割错误的主要问题。:-)@你能看看我最新的答案吗!!并检查问题??Thanks@Barmar谢谢你快速专业的回答。评价