将数组分成单独的块

时间:2013-11-16 23:12:02

标签: c structure typedef

我需要创建一个C程序(我正在使用Xcode)来读取文件并将第一行分成4个不同的变量。

我有一个名为“network”的typedef结构:

typedef struct {
    int a, b, c, d;
    char op_sys[10];
} network;

我还有一个文件,其中包含操作系统旁边的IP地址列表。 例如,第一行显示为:192.116.112.1 windows

我想扫描第一行并制作:

a = 192
b = 116
c = 112
d = 1
op_sys = "windows"

然后转到下一行并执行相同的操作..

知道怎么做吗?任何建议都会很棒!!!

我现在正在尝试这一步。它正在读取文件并打印它,我只是不知道如何将它分成单独的变量。

int main(void)
{
    FILE *input;
    char s[25];

    input = fopen("inputfile.txt", "r");

    while(fgets(s, 25, input) != NULL)
    {
        printf("%s\n", s);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是一个简单的实现:

#include <string.h>
#include <stdio.h>

#define SIZE 10 // Max length (including NULL character at the end) of op_sys field

typedef struct {
   int a, b, c, d;
   char op_sys[SIZE];
} network;

int main(int argc,char *argv[])
{
    FILE *input;
    char s[16+SIZE+1];  // This will contain a line from the text file. (16+SIZE+1) is the max length possible for a line.
                        // 16 for IP address, SIZE for the OS name and 1 for the NULL character.
    network net;
    char *token=NULL;
    char delim[]={'.',' ','\n','\0'};   // Delimiters used to divide each line in tokens

    input = fopen("inputfile.txt", "r");

    while(fgets(s,(16+SIZE+1),input)!=NULL)
    {
      token=strtok(s,delim);        // We get the first octet of the address
      net.a=atoi(token);
      token=strtok(NULL,delim);     // We get the second octet of the address
      net.b=atoi(token);
      token=strtok(NULL,delim);     // We get the third octet of the address
      net.c=atoi(token);
      token=strtok(NULL,delim);     // We get the fourth octet of the address
      net.d=atoi(token);
      token=strtok(NULL,delim);     // We get the OS name...
      char *ptr=net.op_sys;
      ptr=strncpy(ptr,token,SIZE);  // ... and we copy it in net.op_sys
      ptr[SIZE-1]='\0';
      printf("%3d.%3d.%3d.%3d\t\t%s\n",net.a,net.b,net.c,net.d,net.op_sys);     // We print the values of all the fields
    }

    fclose(input);

    return 0;
}


请记住,此实现不会检查行的格式是否正确,也不会检查操作系统名称的长度是否长于SIZE。我把这种支票留给你。