c-从关联指针数组中逐字符读取字符串



已解决

我创建了一个新的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需要额外的空间)。

最新更新