我正在使用 while 循环一个一个地输入字符(要输入的字符总数未知)。如何将我的字符存储在数组中:
I am using while loop to enter characters one by one(total number of characters to be entered is unknown). How can I store my characters in an array:
用户必须输入未知长度的字符串(<1000)。所以这里我使用了while
循环,#define
,getchar
.
我应该怎么做才能同时存储字符?
#include <stdio.h>
#define EOL '\n'
int main()
{
int count=0;
char c;
while((c=getchar())!= EOL)// These c's have to be stored.
{
count++;
}
return 0;
}
编辑:抱歉我没有早点说这件事。如果 count!=1000
,我不必浪费 1000 个字节。这就是为什么我最初没有声明任何 1000 个元素的数组。
如果您不知道字符串中有多少个字符,但有一个硬性上限,您可以简单地为该上限分配足够的 space:
char tmpArray[1000];
将字符存储在那里:
while((c=getchar())!=EOL)
{
tmpArray[count] = c;
count++;
}
然后在循环结束并且知道有多少个字符(通过计数变量)后,您可以分配一个具有正确数量的新数组并将临时字符串复制到其中:
char actualArray[count];
for(int i = 0;i < count + 1;i++) {
actualArray[i] = tmpArray[i];
}
然而,这不是很好,因为无法从内存中释放大数组 up/removed。使用 malloc 和 char* 可能是更好的主意:
char* tmpArray = malloc((sizeof(char)) * 1001);
while((c=getchar())!=EOL) {
tmpArray[count] = c;
count++;
}
char* actualArray = malloc((sizeof(char)) * count + 1);
strncpy(actualArray, tmpArray, count + 1);
free(tmpArray);
/***later in the program, once you are done with array***/
free(actualArray);
strncpy 的参数是 (destination, source, num) 其中 num 是要传输的字符数。我们将计数加一,以便字符串末尾的空终止符也被传递。
实现一个动态增长的数组
使用calloc()
或malloc()
来分配一个小的内存块——比如说10个字符
如果需要,使用realloc()
增加内存块的大小
示例:
#include <stdio.h>
#include <stdlib.h>
#define EOL '\n'
int main()
{
int count = 0;
int size = 10;
char *chars = NULL;
char c;
/* allocate memory for 10 chars */
chars = calloc(size, sizeof(c));
if(chars == NULL) {
printf("allocating memory failed!\n");
return EXIT_FAILURE;
}
/* read chars ... */
while((c = getchar()) != EOL) {
/* re-allocate memory for another 10 chars if needed */
if (count >= size) {
size += size;
chars = realloc(chars, size * sizeof(c));
if(chars == NULL) {
printf("re-allocating memory failed!\n");
return EXIT_FAILURE;
}
}
chars[count++] = c;
}
printf("chars: %s\n", chars);
return EXIT_SUCCESS;
}
用户必须输入未知长度的字符串(<1000)。所以这里我使用了while
循环,#define
,getchar
.
我应该怎么做才能同时存储字符?
#include <stdio.h>
#define EOL '\n'
int main()
{
int count=0;
char c;
while((c=getchar())!= EOL)// These c's have to be stored.
{
count++;
}
return 0;
}
编辑:抱歉我没有早点说这件事。如果 count!=1000
,我不必浪费 1000 个字节。这就是为什么我最初没有声明任何 1000 个元素的数组。
如果您不知道字符串中有多少个字符,但有一个硬性上限,您可以简单地为该上限分配足够的 space:
char tmpArray[1000];
将字符存储在那里:
while((c=getchar())!=EOL)
{
tmpArray[count] = c;
count++;
}
然后在循环结束并且知道有多少个字符(通过计数变量)后,您可以分配一个具有正确数量的新数组并将临时字符串复制到其中:
char actualArray[count];
for(int i = 0;i < count + 1;i++) {
actualArray[i] = tmpArray[i];
}
然而,这不是很好,因为无法从内存中释放大数组 up/removed。使用 malloc 和 char* 可能是更好的主意:
char* tmpArray = malloc((sizeof(char)) * 1001);
while((c=getchar())!=EOL) {
tmpArray[count] = c;
count++;
}
char* actualArray = malloc((sizeof(char)) * count + 1);
strncpy(actualArray, tmpArray, count + 1);
free(tmpArray);
/***later in the program, once you are done with array***/
free(actualArray);
strncpy 的参数是 (destination, source, num) 其中 num 是要传输的字符数。我们将计数加一,以便字符串末尾的空终止符也被传递。
实现一个动态增长的数组
使用
calloc()
或malloc()
来分配一个小的内存块——比如说10个字符如果需要,使用
realloc()
增加内存块的大小
示例:
#include <stdio.h>
#include <stdlib.h>
#define EOL '\n'
int main()
{
int count = 0;
int size = 10;
char *chars = NULL;
char c;
/* allocate memory for 10 chars */
chars = calloc(size, sizeof(c));
if(chars == NULL) {
printf("allocating memory failed!\n");
return EXIT_FAILURE;
}
/* read chars ... */
while((c = getchar()) != EOL) {
/* re-allocate memory for another 10 chars if needed */
if (count >= size) {
size += size;
chars = realloc(chars, size * sizeof(c));
if(chars == NULL) {
printf("re-allocating memory failed!\n");
return EXIT_FAILURE;
}
}
chars[count++] = c;
}
printf("chars: %s\n", chars);
return EXIT_SUCCESS;
}