【问题标题】:Convert one dimensional string array to two dimensional string array in c在c中将一维字符串数组转换为二维字符串数组
【发布时间】:2015-03-10 09:58:12
【问题描述】:
char   *buffer;        /* holds the file contents. */
char   **transfer;
unsigned long    countNewLine = 0;
size_t  rowTrack;
size_t  columnTrack;

// assume countNewLine is 12

buffer_size = BUFSIZ;
buffer = malloc(buffer_size);
transfer = (char**)malloc(sizeof(char*)*sizeof(countNewLine));

columnTrack = 0;


while ( columnTrack < countNewLine ) {

    for ( rowTrack = 0; buffer[rowTrack] != '\n' || buffer[rowTrack] != '\0'; rowTrack++ )
        transfer[columnTrack][rowTrack] = buffer[rowTrack];

        columnTrack++;
}

我正在尝试将一维字符串数组转换为二维。我对自己的错误一无所知。谢谢你的解决方案。

调试器结果:

    buffer  char *  "first\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\n
              eighth\nninth\ntenth\neleventh\ntwelfth\nthirteenth"  0x0000000100801200
    *buffer char    'f' 'f'
    countNewLine    unsigned long   12  12
    transfer    char ** 0x100105520 0x0000000100105520
    *transfer   char *  NULL    0x0000000000000000
    rowTrack    size_t  0   0
    columnTrack size_t  0   0

【问题讨论】:

  • sizeof(char*)*sizeof(countNewLine)..看起来很可疑。
  • 标准警告:请do not castmalloc()和family的返回值。
  • 循环永远不会以buffer[rowTrack] != '\n' || buffer[rowTrack] != '\0'; 终止,它应该使用&amp;&amp;,而且您还没有为*transfer[] 的每一行分配内存。
  • @WeatherVane Desktop/test/test/test/main.c:14:13:定义数组类型的变量需要明确的大小或char *transfer[]的初始化器
  • 所以,要明确一点,您想用换行符拆分字符串吗?

标签: c arrays string malloc


【解决方案1】:

您的代码中有几个错误。在这一行

transfer = (char**)malloc(sizeof(char*)*sizeof(countNewLine));

第二个sizeof()不正确,该行应该是

transfer = malloc(sizeof(char*) * countNewLine);

接下来,你没有为每一行分配内存,可能是这样的

for ( rowTrack = 0; rowTrack < countNewLine; rowTrack++)
    transfer[rowTrack] = malloc(BUFSIZ);    // or whatever the line length is

for 循环永远不会通过使用 || 而终止

for ( rowTrack = 0; buffer[rowTrack] != '\n' || buffer[rowTrack] != '\0'; rowTrack++ )

应该是

for ( rowTrack = 0; buffer[rowTrack] != '\n' && buffer[rowTrack] != '\0'; rowTrack++ )

最后,我认为您在此语句中颠倒了行和列索引:

transfer[columnTrack][rowTrack] = buffer[rowTrack];

有一种更简洁的方式来分割你的字符串,像这样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZ 512

int main(void) { 

    char *buffer;
    char *sptr;
    char **transfer = NULL;
    int rows = 0, row;

    /* ... load the file contents */
    buffer = malloc(BUFSIZ);
    strcpy (buffer, "first\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neighth\nninth\ntenth\neleventh\ntwelfth\nthirteenth");

    /* split the input */
    sptr = strtok(buffer, "\r\n");
    while (sptr) {
        transfer = realloc(transfer, (rows+1) * sizeof(char*));  // expand string array
        transfer[rows] = malloc(1+strlen(sptr));    // memory for string
        strcpy (transfer[rows], sptr);              // copy the token
        rows++;
        sptr = strtok(NULL, "\r\n");
    }

    /* show array */
    printf ("Showing %d rows\n", rows);
    for (row=0; row<rows; row++) {
        printf ("%s\n", transfer[row]);
        free (transfer[row]);                       // release mem
    }

    free (transfer);                                // release mem
    free (buffer);                                  // release mem
    return 0;
}

程序输出:

Showing 13 rows
first
second
third
fourth
fifth
sixth
seventh
eighth
ninth
tenth
eleventh
twelfth
thirteenth

【讨论】:

  • 条件中的逗号没有做(我认为)你期望它做的事情:for (...; expr1, expr2; ...)
  • buffer = malloc(BUFSIZ);transfer = malloc(BUFSIZ); ?
  • @pmg 我希望两个表达式都为真,以便循环继续进行,如果我错了,请纠正我。
  • @user3674483 **transfer是一个指针数组,相当于*transfer[]
  • no: for (k = 0; 0, 1; k++) 是一个无限循环(除非里面有中断):codepad.org/XNaniURQ
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2019-01-23
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多