如何用键盘填充空Char数组?
之类的东西char a_string[];
while("if not Q")
{
printf("Enter a number: ");
scanf("%c", a_string);
}
我知道这是错的 我只是想知道如何给我的a_string []赋值,而不限制大小。 所以尺寸会有所不同,取决于我将从键盘输入的按键数量。
谢谢!
答案 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')) {