如何在C中设置从标记字符到这个名为customerData[][]的数组的值?
我刚开始学习C语言,我需要一些程序方面的帮助。这是代码。如何在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元素=
问题:
#包括
#定义输入长度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);