任何人都可以向我解释动态创建具有稳定第二维的2D字符串数组的最简单方法吗?我有一个带有一些字符串的txt文件,我想将这个txt传输到一个数组。所以我想将txt行号与第一维相关联,将字符串本身与第二维相关联。第二个维度是每一行中的字符数(这是稳定的,因为txt中的每一行都有一定的语法)所以,如果我有我的txt:
hello how (newline)
are youuu
*(我写了youuu
,因为正如我所说,每一行都有相同数量的字符。)
我想要类似的东西:
array[0]["hello how"],
array[1]["are youuu"]
答案 0 :(得分:2)
C中不允许使用非数字键。您尝试使用仅适用于数字的语言进行一些PHP和JavaScript废话。
但是,有了C,总有两条地狱之路。
char *lookup_key(int index, char *key) { ... }
printf(lookup_key(0, "hello how"));
答案 1 :(得分:2)
如果你知道字符串的长度和你拥有的数量,你可以像这样配置数组
char strings[numLines][strLen+1];
然后,您可以像这样访问数组
strcpy(strings[1], "test2");
如果你事先不知道任何事情,你需要一个指向指针数组的指针,然后使用malloc在数组增长时分配空间,完成时自由。
答案 2 :(得分:1)
dynamic 意味着您需要使用[c] [m] alloc之一为字符串创建内存。 2D 意味着char
数组的数组。假设您知道字符串的数量和所需的最长字符串,以下内容将创建包含它们的内存:
char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
int i;
char **a = {0};
a = calloc(numStrings, sizeof(char *));
for(i=0;i<numStrings; i++)
{
a[i] = calloc(maxStrLen + 1, 1);
}
return a;
}
以下内容将释放上面创建的内存:
void free2DStr(char ** a, ssize_t numStrings)
{
int i;
for(i=0;i<numStrings; i++)
{
if(a[i]) free(a[i]);
}
free(a);
}
可以这样调用:
...
char **strArray = {0};
strArray = Create2DStr(10, 20);
//Use strArray...
free2DStr(10);
提供10个数组,每个数组包含20个char,加上NULL。 (+ 1
之后的maxStrLen
为NULL提供了额外的空间。
答案 3 :(得分:1)
如果要将文件的每一行保存为数组中的一行,请使用char
的二维数组:
char fileContents[NUM_LINES][LINE_LENGTH + 1]; // +1 for zero terminator
如果你不知道前面有多少行,你需要做一些内存管理。首先,您需要分配一个初始范围:
#define INITIAL_EXTENT 20 // or some good starting point
char (*fileContents)[LINE_LENGTH + 1] = malloc( sizeof *fileContents * INITIAL_EXTENT );
if ( !fileContents )
{
// malloc failed; fatal error
fprintf( stderr, "FATAL: could not allocate memory for array\n" );
exit( EXIT_FAILURE );
}
size_t numRows = INITIAL_EXTENT; // number of rows in array
size_t rowsRead = 0; // number of rows containing data
当您从文件中读取时,您将检查以确保您在阵列中有空间;如果不这样做,则需要使用realloc
调用来扩展数组,这可能是一项非常昂贵的操作。一种常见的技术是每次扩展时将数组的大小加倍 - 这样可以最大限度地减少realloc
次调用的总数。如果你将数组大小加倍,那么风险是一些内部碎片,因为你只需要一行,但这可能是你可以分析的东西:
char tmpBuf[LINE_LENGTH + 2]; // account for newline in input buffer
while ( fgets( tmpBuf, sizeof tmpBuf, inputFile ) )
{
/**
* Check to see if you have any room left in your array; if not,
* you'll need to extend it. You'll probably want to factor this
* into its own function.
*/
if ( rowsRead == numRows )
{
/**
* Use a temporary variable for the result of realloc in case of failure
*/
char (*tmp)[LINE_LENGTH + 1] =
realloc( fileContents, sizeof *fileContents * ( 2 * numRows ) );
if ( !tmp )
{
/**
* realloc failed - we couldn't extend the array any more.
* Break out of the loop.
*/
fprintf( stderr, "ERROR: could not extend fileContents array - breaking out of loop\n" );
break;
}
/**
* Otherwise, set fileContents to point to the new, extended buffer
* and update the number of rows.
*/
fileContents = tmp;
numRows *= 2;
}
// strip the newline from the input buffer
char *newline = strchr( tmpBuf, '\n' );
if ( newline )
*newline = 0;
strcpy( fileContents[rowsRead++], tmpBuf );
}