繁体   English   中英

将char指针放到char指针的2d数组中的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM