已解决
我创建一个新的char *ch malloc(strlen)
并逐个循环该字符串char。然后我使用memcpy(ch, &stringpool[index], len)
将其复制回去,当然,之后是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推送到堆栈上。
答案 0 :(得分:1)
char **string_pool; string_pool = malloc( sizeof(char *) * 1024);
分配1024个指针到字符。 (string_pool
是一个 pointer-to-pointer-to-char )。每个指针都未初始化,并且指向没有可用的有效存储。在使用每个指针之前,必须通过分配内存并将起始地址分配给每个指针,使它们指向有效内存(以便每个指针“指向”有效内存)。
要允许对每个读取的字符串进行适当的大小调整和分配,您可以将fgets
与固定缓冲区一起使用,该缓冲区足以存储您期望的最长输入,或者可以使用POSIX getline
进行分配根据需要存储输入。使用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
时输入,以确保您不会尝试为一个指针分配过多的存储空间。
仔细研究一下,如果您有任何疑问,请告诉我。
答案 1 :(得分:0)
您必须为每个字符串分配空间。 因此,例如
string_pool[0] = malloc( 100 );
然后将允许您将一个最长为99个字符的字符串读取到string_pool [0]中(终止null需要额外的空间)。