首页 > 解决方案 > 从关联指针数组中逐字符读取字符串

问题描述

解决了

我创建一个新的char *ch malloc(strlen)并逐个字符地循环该字符串。memcpy(ch, &stringpool[index], len)然后我用Of course,after复制回来free(ch)


我希望我的问题的标题是正确的。

我有一个字符串池

char **string_pool;

在类似的函数中启动

string_pool = malloc( sizeof(char *) * 1024);

我从标准输入获取字符串并将它们扫描到数组中

scanf("%[^\n]s", &string_pool[index]);

所以我可以使用 printf 打印出来

printf("gets %s\n", &string_pool[index]);

我怎样才能

谢谢

编辑

也许我应该多解释一下,它是一个带有虚拟指令集的虚拟机和一个类似的程序

push 1
read
gets

应该 :

功能看起来像

    case GETS: {
        int index = popv(); // index is already on top of the stack
        int strl = strlen(&string_pool[index]);

        printf("gets %s with a length of %d\n", &string_pool[index], strl);
        // pseudo code
        // push each char as integer on the stack
        foreach(char in string_pool[index]) push((int)char);

        break;
    }

    case READ: {  
        int index = popv();          
        scanf("%[^\n]s", &string_pool[index]);
        break;
    }

    case WRITE: {  
        int index = popv();          
        printf("%s", &string_pool[index]);
        break;
    }

我的问题是在GETS案例中。我想将每个 char 作为 int 推入堆栈。

标签: carraysstringpointers

解决方案


char **string_pool;
string_pool = malloc( sizeof(char *) * 1024);

分配 1024个指向 char 的指针。( string_poolis a pointer-to-pointer-to-char ) 每个指针都未初始化并且指向没有可以使用的有效存储。在您可以使用每个指针之前,您必须通过分配内存并将起始地址分配给每个指针来使它们指向有效内存(以便每个指针“指向”有效内存)。

为了允许对您读取的每个字符串进行适当的大小调整和分配,您将使用fgets足以存储您期望的最长输入的固定缓冲区,或者您可以使用 POSIXgetline它将根据需要为输入分配存储空间。使用 fgets 你会做类似的事情:

#define MAXCHR 2048
...

char buffer[MAXCHR];

fputs ("enter string: ", stdout);
if (fgets (buffer, MAXCHR, stdin) == NULL) {
    fputs ("(user canceled input.)\n", stderr);
    return 1;
}

size_t len = strlen (buffer);   /* get the length of input (with '\n') */
if (len && buffer[len - 1] == '\n')    /* trim the '\n' from end */
    buffer[--len] = 0;          /* by overwriting with nul-character */


string_pool[index] = malloc (len + 1);      /* allocate storage for buffer */
if (string_pool[index] == NULL) {           /* validate allocation */
    perror ("maklloc-string_pool[index]");  /* handle error */
    return 1;  /* or break read loop; */
}
/* copy buffer to string_pool[index], advance index */
memcpy (string_pool[index++], buffer, len + 1); 

您通常会在您的读取循环中执行此操作,仅允许输入,同时index < 1024确保您没有尝试为一个指针分配过多的存储空间。

看看事情,如果你有问题,请告诉我。


推荐阅读