【问题标题】:Dynamically read string from input in C从 C 中的输入动态读取字符串
【发布时间】:2019-02-01 12:08:46
【问题描述】:

我正在尝试读取用户输入的值并将其存储在字符串中。字符串必须是逗号之前或行尾的所有字符,并且需要输出逗号或EOF。

我正在尝试读取每个字符并根据需要在字符串中分配空间,但文件在读取第一个输入后停止。

这是我目前所拥有的:

char read_data(char** str) {
  char c = 'n';
  int size = sizeof(**str);

  int i = 0;
  while (((c = getchar()) != COMMA) && (c != NEWLINE)) {
    size += sizeof(c);

    *str = (char*) realloc(*str, size + 1);
    assert(*str);

    *str[i] = c;
    i++;

  }

  *str[i] = '\0'; //terminator
  return c;
}

int main(int argc, char const *argv[]) {
  char* string = NULL;
  char left;
  left = read_data(&string);
  printf("left: %c\n", left);
  printf("string: %s\n", string);

  free(string);
  return 0;
}

我不知道它为什么会坏掉。有没有人有任何提示/想法..?

【问题讨论】:

  • int size = sizeof(**str); -- size 的值将始终为 1,因为 strchar **,双重取消引用导致 char,并且 sizeof char 保证永远是 1。
  • @DavidBowling:没错,但不是问题。
  • 考虑当第一个字符是',' 时会发生什么。 *str[i] = '\0'; 尝试通过未初始化的指针进行分配。

标签: c string dynamic malloc allocation


【解决方案1】:

因为array subscripting ([]) has higher precedence than indirection (*),当您编写*str[i] 时,您会得到*(str[i])——第i 个字符串的第一个字符。但是,你想要(*str)[i]

这里有四种写法,都表示“字符串*str的第i个字符”:

(*str)[i]
str[0][i]
i[*str]
*(*str+i)

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多