已解决
我创建了一个新的char *ch malloc(strlen)
,并逐字符循环该字符串。然后我用memcpy(ch, &stringpool[index], len)
把它复制回来。当然,之后用free(ch)
。
我希望我的问题标题是正确的。
我有一个字符串池
char **string_pool;
在类似的功能中启动
string_pool = malloc( sizeof(char *) * 1024);
我从stdin获取字符串,并将它们扫描到数组中
scanf("%[^n]s", &string_pool[index]);
所以我可以用printf 打印出来
printf("gets %sn", &string_pool[index]);
我怎么能
- 获取字符串池〔index〕的长度
- 在循环中逐字符读取string_pool[index]
谢谢
编辑
也许我应该多解释一下,它是一个带有虚拟指令集和类似的程序的虚拟机
push 1
read
gets
应该:
- 在堆栈上推1->设x为1
- 将stdin作为字符串读取到string_pool[x]中
- 将所有字符推送到堆栈中
函数看起来像
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 %dn", &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案件。我想把每个字符都作为int推送到堆栈中。
char **string_pool; string_pool = malloc( sizeof(char *) * 1024);
将1024个指针分配给char。(string_pool
是指向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
时进行输入,以确保您不会试图为过多的一个指针分配存储空间。
仔细看看,如果你有问题,请告诉我。
必须为每个字符串分配空间。例如,
string_pool[0] = malloc( 100 );
将允许您将一个长达99个字符的字符串读取到string_pool[0]中(终止null需要额外的空间)。