如何在C中设置从标记字符到这个名为customerData[][]的数组的值?

如何在C中设置从标记字符到这个名为customerData[][]的数组的值?,c,arrays,file,2d,tokenize,C,Arrays,File,2d,Tokenize,我刚开始学习C语言,我需要一些程序方面的帮助。这是代码。 问题: 这是什么?customerData[NUM_FIELDS][FIELD_LENGTH] 它是一个字符2D数组吗 如何将数据输入阵列?fgetC,putchar,getchar #包括 #定义输入长度128 #定义字段长度为30 #定义NUM_字段9 int main() { 文件*数据=NULL; 字符输入[输入长度]; char customerData[NUM_FIELDS][FIELD_LENGTH]; int元素=

我刚开始学习C语言,我需要一些程序方面的帮助。这是代码。
问题:

  • 这是什么?customerData[NUM_FIELDS][FIELD_LENGTH]
  • 它是一个字符2D数组吗
  • 如何将数据输入阵列?fgetC,putchar,getchar
  • 
    #包括
    #定义输入长度128
    #定义字段长度为30
    #定义NUM_字段9
    int main()
    {   
    文件*数据=NULL;
    字符输入[输入长度];
    char customerData[NUM_FIELDS][FIELD_LENGTH];
    int元素=0;
    char*next;
    char ch;
    data=fopen(“data.txt”,“r”);
    如果(数据!=NULL)
    {
    //令牌=strtok(输入“|”);
    /*而循环将逐行遍历并将其存储在输入数组中*/
    while(fgets(输入、输入长度、数据)!=NULL)
    {
    next=strtok(输入“|”);
    while(下一步!=NULL)
    {  
    //ch=getchar()
    //>可能是给ch的一个get char
    strcpy(下一个,customerData[元素][strlen(下一个)];
    /*需要将这些值逐个放入客户数据中*/
    printf(“%s\n”,下一步);
    //元素+=1;
    next=strtok(空,“|”);
    }
    //元素=0;
    } 
    printf(“程序已完成”\n);
    } 
    fclose(数据);
    返回0;
    }
    
    通常,“帮助我编写代码”问题与堆栈溢出无关。为了继续讨论这个主题,我将只关注如何访问2D字符数组的问题

    是的,这是一个2D字符数组。或者,换句话说,它是一个具有
    NUM\u字段
    元素的数组,其中数组的每个元素都是一个具有
    FIELD\u长度
    元素的字符数组

    在2D字符数组中插入数据的方法有很多种,但我最常遇到的可能有两种。您选择使用哪一个将取决于您对该数组的看法

    选项1:单个字符的二维数组 第一种考虑这个变量的方法是简单地将其看作一个二维字符数组——一个可以访问的元素网格。在这里,您可以使用普通赋值运算符简单地输入值。您需要确保索引在范围内,否则将开始访问无效内存

    //Set a known element that's definitely in range
    customerData[1][2] = 'A';
    
    //Loop through all the elements
    for(int ii = 0; ii < NUM_FIELDS; ii++)
    {
        for (int jj = 0; jj < FIELD_LENGTH; jj++)
        {
            customerData[i][j] = 'B';
        }
    }
    
    //Set an element from variables
    char nextInput = getNextCharFromInput();
    
    if(x < NUM_FIELD && y < FIELD_LENGTH)
    {
        customerData[x][y] = nextInput;
    }
    
    //Bad. This could corrupt memory
    customerData[100][60] = 'X';
    
    //Risky without check. How do you know x and y are in range?
    cusomterData[x][y] = 'X';
    

    两者都分别处理从标准输出和文件中读取字符,因此不能用于将数据放入变量中。处理将字符放入对象中的操作,但仅处理标准输出,因此不能在此处使用。

    (1)它是一个2D
    char
    数组。(2) 对。(3) 你可以用十亿种不同的方式来做,这太宽泛了,无法回答。我现在明白了。只要[field length]有足够的大小,将单词strcpy到特定位置customerData[element]就足够了。不过,我会研究你的解释。
    //Set a known element that's definitely in range
    customerData[1][2] = 'A';
    
    //Loop through all the elements
    for(int ii = 0; ii < NUM_FIELDS; ii++)
    {
        for (int jj = 0; jj < FIELD_LENGTH; jj++)
        {
            customerData[i][j] = 'B';
        }
    }
    
    //Set an element from variables
    char nextInput = getNextCharFromInput();
    
    if(x < NUM_FIELD && y < FIELD_LENGTH)
    {
        customerData[x][y] = nextInput;
    }
    
    //Bad. This could corrupt memory
    customerData[100][60] = 'X';
    
    //Risky without check. How do you know x and y are in range?
    cusomterData[x][y] = 'X';
    
    //Set a specific field to a known string, which is short enough to fit
    strcpy(customerData[2], "date");
    
    //Loop through all fields and wipe their data
    for(int ii = 0; ii < NUM_FIELDS; ii++)
    {
        memset(customerData[ii], 0, FIELD_LENGTH);
    }
    
    //Set field based on variables
    if(x < NUM_FIELDS)
    {
        //Will truncate next if it is too long
        strncpy(customerData[x], next, FIELD_LENGTH);
    
        //Will not input anything if field is too long
        if(strlen(next) < FIELD_LENGTH)
        {
            strcpy(customerData[x], next);
        }
    }
    
    //Bad. Could corrupt memory
    strcpy(customerData[100], "date");
    strcpy(customerData[1], "this string is definitely much longer than FIELD_LENGTH");
    
    //Risky. Without a check, how do you know either variable in in range?
    strcpy(customerData[x], next);