3

我想读取数组中的一组字符串。数组的大小将在运行时使用mallocalloc即接受字符串的数量作为输入来决定。我尝试了以下代码,但它不起作用。

char *array;
array=(char*)malloc(sizeof(char)*t); //t is the size of array
for(int temp=0;temp<t;temp++)
{
    gets(a[temp]);
}

在整数数组的情况下也是如此。
请帮助我找到解决方案。

4

4 回答 4

5

C 对存储字符串没有任何自动内置支持,没有“字符串”变量,并且可以自动增长以容纳适当数量的字符。您需要自己分配内存。

您现在正在做的是为适当数量的字符指针分配位置,而不是为任何字符分配位置。所以gets()调用正在写入未分配的内存,这是未定义的行为。由于每个整数都完全适合单个分配,这就是为什么类似的代码适用于整数。字符串更复杂,所以你需要做更多的工作。

如果这些字符串的长度有任何已知的上限,则可以使用固定长度的临时缓冲区,然后在知道所需大小后将其复制到新分配的动态内存中。如果没有这样的界限,你需要重复相同的概念,通过读取一个固定的块,存储它,如果没有找到行尾,读取另一个块,使用 增加这个字符串的内存分配realloc(),追加新字符,并重复直到行结束。

附带说明一下,您应该始终避免使用gets(),因为它不支持保护您的程序免受缓冲区溢出。使用 fgets() 会好得多,记录在同一页面上。

于 2012-05-08T09:39:48.500 回答
1

您分配的是恰好一个字符串的空间,以零结尾的格式存储。

如果你想存储几个字符串的数组,你需要malloc()一个数组char *加上几个字符串。

此外,gets()不安全,因为没有大小限制。相反,使用fgets(). 它具有以下签名:

char *fgets(char *restrict s, int n, FILE *restrict stream);

因为它想要一个流,你应该给stdin.

所以阅读一行的最佳方法是

char * read_one_line(uint32_t maxbufsize)
{
    char * s = malloc(maxbufsize);
    if (!fgets(s, maxbufsize, stdin)) {
        free(s);
        return NULL;
    } else {
        char * s2 = realloc(s, strlen(s)+1); // +1 for the NUL at the end
        if (s2) {
            return s2;
        } else {
            return s; // should never happen as the memory block is shrinked
        }
    }
}

此函数分配一行所需的内存,在读取后适当调整其大小,并将其留给调用者在适当的时间再次释放它。

于 2012-05-08T09:39:59.367 回答
1

您需要首先为字符串数组 ( char*) 分配空间:

char **array;
array = (char**)malloc(sizeof(char*)*t);

然后你需要为它们中的每一个分配空间(让我们50成为这些字符串的最大字符数):

int i = 0, m = 50;
for (i = 0; i < t; ++i)
    array[i] = (char*)malloc(sizeof(char)*51); // 51 = 50 characters + '\0'

然后你可以做你想做的事:

for(i = 0; i < t; ++i)
    scanf("%50s", array[i]);

而不是gets,最好使用scanf指定的宽度%50s= 50 个字符 + '\0')。

于 2012-05-08T09:42:27.123 回答
0

请记住,最后在字符数组中应该有一个NUL字符。

所以用or分配t+1内存字节。allocmalloc

t字符的字节和终止NUL字符的 1 个字节。

在你的for循环之后,即在循环之外,只需写

a[temp] = '\0';

然后你可以在工作中使用它。

我希望它会奏效。

它看起来像这样

char *a = malloc(sizeof((char)*(t+1)));//t is number if characters
int temp;
for(temp=0; temp<t; temp++) {
    gets(a[temp]);
}
a[temp] = 0;

然后打印数组,你会得到一个字符串。

printf("%s",a);
于 2012-05-08T09:50:40.057 回答