从关联指针数组中按字符读取字符串char

时间:2019-01-19 21:12:23

标签: c arrays string pointers

已解决

我创建一个新的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]);

我怎么能

  • 获取string_pool [index]的长度
  • 按字符顺序循环读取string_pool [index] char

谢谢

修改

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

的程序
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 %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推送到堆栈上。

2 个答案:

答案 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需要额外的空间)。