[英]issues putting char pointers into 2d array of char pointers
我很乐意在这里提供帮助,让我发疯。
大文件使用strtok分割我的行。 我正在尝试将第一部分分离出来,将其保存到我的symbolTblChar [lblCnt]中。 我似乎无法理解的是为什么从文件中拉出后,我的输出变得如此奇怪
输入
"SPACE \n LINE \n A1 \n A2"
码
char* symbolTblChar[MAX_SYMBOLS][100];
int lblCnt = 0;
char line[LINE_SIZE];
char* chk;
while(fgets(line, sizeof line, fp) != NULL) {
chk = (char*)strtok( line, delims );
printf("Adding %s to symbol table", chk);
*symbolTblChar[lblCnt]=chk + '\0';
lblCnt++;
int t;
for(t = 0; t < lblCnt; t++)
printf("%s\n", *symbolTblChar[t]);
}
输出:
Adding SPACE to symbol table
Adding LINE to symbol table
LINE
Adding A1 to symbol table
A1
A1
Adding A2 to symbol table
A2
A2
A2
您需要分配和存储字符。 使用您的代码,您将存储字符数组line
指针,当您读取后续line
,它将被覆盖。
你需要做类似的事情
*symbolTblChar[lblCnt]= strdup(chk);
另外,不确定是否需要使用双字符指针作为
char* symbolTblChar[MAX_SYMBOLS][100];
您可以在下面使用它将存储MAX_SYMBOLS
个字符串。
char* symbolTblChar[MAX_SYMBOLS];
我想我知道您正在尝试做什么。 除了Rohan的回答,您还对strtok
的使用strtok
。 尽管这有点困难22,但是由于您正在读取带有用newlines
分隔的符号的字符串,所以仍然可以使strtok
起作用。 但是请理解,在使用strtok
,对strtok
的首次调用将指向字符串的指针用作其第一个参数:
chk = strtok (line, delims);
而随后所有对strtok
调用都使用NULL
作为第一个参数:
chk = strtok (NULL, delims);
strtok
优点在于它是为以for
循环格式解析整个字符串而量身定制的。 例如:
for (chk = strtok (line, delims); chk; chk = strtok (NULL, delims))
将它们放在一起,然后将symbolTblChar[MAX_SYMBOLS]
清理为简单的char
指针数组,重新排列一下逻辑,即可提供以下示例。 我猜到了您对LINE_SIZE
以及对MAX_SYMBOLS
(根据需要进行调整):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_SIZE 128
#define MAX_SYMBOLS 32
int main (int argc, char **argv) {
char *symbolTblChar[MAX_SYMBOLS] = {NULL};
char line[LINE_SIZE] = {0};
char *chk = NULL;
char delims[] = " \n";
int lblCnt = 0;
int t = 0;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (fp != stdin && !fp) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
printf ("\nCollecting Symbols:\n");
while (fgets (line, LINE_SIZE, fp))
{
for (chk = strtok (line, delims); chk; chk = strtok (NULL, delims)) {
printf (" Adding %s to symbol table\n", chk);
symbolTblChar[lblCnt] = strdup (chk);
lblCnt++;
/* check for MAX_SYMBOLS */
if (lblCnt == MAX_SYMBOLS) {
fprintf (stderr, "warining: MAX_SYMBOLS limit reached.\n");
break;
}
}
}
/* close file if not stdin */
if (fp != stdin) fclose (fp);
/* output */
printf ("\nSymbols:\n");
for (t = 0; t < lblCnt; t++)
printf(" %s\n", symbolTblChar[t]);
/* free allocated memory */
for (t = 0; t < lblCnt; t++)
free (symbolTblChar[t]);
return 0;
}
输出量
使用样本输入可提供:
$ printf "SPACE \n LINE \n A1 \n A2\n" | ./bin/symbltbl
Collecting Symbols:
Adding SPACE to symbol table
Adding LINE to symbol table
Adding A1 to symbol table
Adding A2 to symbol table
Symbols:
SPACE
LINE
A1
A2
注意:完成后,您当然可以删除Adding X ...
中间打印行。 现在,即使可能并不明显,您仍需要使用strdup
(将其参数分配并复制到新的内存位置) free
与添加到symbolTblChar
每个符号关联的内存。 您可以看到这发生在main
的末尾。
如果这不是您想要的,请告诉我。 在查看了问题和正在做什么之后,这似乎是您的逻辑意图。 如果您有任何疑问,请告诉我。
文件输入:请注意,您也可以提供输入文件名作为程序的第一个参数,程序将从文件中读取而不是从stdin
读取。 例如,输入文件:
$ cat symbols.txt
SPACE
LINE
A1
A2
从文件输出读取
$ /bin/symbltbl symbols.txt
Collecting Symbols:
Adding SPACE to symbol table
Adding LINE to symbol table
Adding A1 to symbol table
Adding A2 to symbol table
Symbols:
SPACE
LINE
A1
A2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.