用C中的scanf填充Char数组

时间:2014-02-14 20:23:32

标签: c

如何用键盘填充空Char数组?

之类的东西
char a_string[];
while("if not Q")
{
printf("Enter a number: ");
scanf("%c", a_string);
}

我知道这是错的 我只是想知道如何给我的a_string []赋值,而不限制大小。 所以尺寸会有所不同,取决于我将从键盘输入的按键数量。

谢谢!

3 个答案:

答案 0 :(得分:0)

试试这个:

#include <stdlib.h>
#include <stdio.h>

int main() {
    char *string = NULL;
    char *newstring = NULL;
    char c = '\0';
    unsigned int count = 0;

    while(c != 'Q'){
        c = getc(stdin);
        if(string == NULL){
            string = (char *) malloc(sizeof(char)); // remember to include stdlib.h
            string[0] = c;
        }
        else{
            newstring = (char *) realloc(string, sizeof(char)*count);
            string = newstring;
            string[count] = c;
        }
        count++;
    }

    string[count-1] = '\0';  // remove the Q character
    fprintf(stderr,"here you are: %s",string);
    free(string); // remember this!
    return 0;
}

答案 1 :(得分:0)

如果您在运行开始时就知道要输入的密钥数量,您可以首先询问密钥数量,然后查询单个字符,如下面未经测试的代码段所示。

否则,您必须设置一些永远不会达到的真实世界最大值(例如10000),或者,如果不可能,则设置每个阵列的最大值并设置翻转到新阵列。

这个最后一个选项确实是相同的(最终受到内存的限制)但是会给你一个更大的最大值。

char *mychars;
int numchars;

printf("Please enter the total number of characters:\n");
if (scanf("%d", &numchars) == NULL) {
  printf("couldn't read the input; exiting\n");
  exit(EXIT_FAILURE);
}

if (numchars <= 0) {
  printf("this input must be positive; exiting\n");
  exit(EXIT_FAILURE);
}

mychars = (char *) malloc (numchars * sizeof(char));

int current_pos = 0;
printf("Enter a digit and hit return:\n");

while (scanf("%c", &mychars[current_pos]) != NULL && current_pos < numchars) {
  current_pos++;
  printf("Enter a digit and hit return:\n");
}

答案 2 :(得分:0)

realloc()的重复调用将满足需要。

根据需要加倍realloc()大小以避免O(n)次呼叫。

char *GetQLessString(void) {
  size_t size_alloc = 1;
  size_t size_used = size_alloc;
  char *a_string = malloc(size_alloc);
  if (a_string == NULL) {
    return NULL; // Out  of memory
    }

  char ch;
  while(scanf("%c", &ch) == 1 && (ch != 'Q')) {
    size_used++;
    if (size_used > size_alloc) {
      if (size_alloc > SIZE_MAX/2) {
        free(a_string);
        return NULL; // Too big - been typing a long time
      }
      size_alloc *= 2; 
      char *new_str = realloc(a_string, size_alloc);
      if (new_str == NULL) {
        free(a_string);
        return NULL; // Out  of memory
      }
      a_string = new_str;
    }
    a_string[size_used - 2] = ch;
  }

  a_string[size_used - 1] = '\0';
  return a_string;
}

代码可以做最后的realloc(a_string, size_used)以减少多余的内存分配 调用例程需要在完成缓冲时调用free() 以下将更清洁。

int ch;
while((ch = fgetc(stdin)) != EOF && (ch != 'Q')) {