如何创建动态字符串?'我想动态地创建一个字符串,但是我没有;t像这样使用它:字符串=(字符 *)malloc(100 * 字符大小);

gtlvzcf8  于 2023-02-03  发布在  其他
关注(0)|答案(3)|浏览(146)
#include<stdio.h>
#include<string.h>
int main()
{
    char string[100];
    printf("Enter string: ");
    fgets(string, 100, stdin);
    return 0;
}

或者我们也可以这样做:

char **string;
string = (char **)malloc(100 * sizeof(char*));
kq4fsx7k

kq4fsx7k1#

数组在C语言中有固定大小和动态大小之一,不能两者都有。当接受用户输入时,使用固定大小的数组是非常明智的,因为接受“无限输入”没有任何意义。
如果有大量数据要存储,那么一旦输入得到验证,就可以将其从固定大小的数组复制到动态数组中。
动态分配数组的唯一明智的方法 * 是 * 使用malloc(函数族)。它是作为char* arr = malloc(100);完成的,不需要强制转换字符的大小。“我不想”不是一个很好的理由,这是语言的工作原理。
至于char **string; string = (char *)malloc(100 * sizeof(char));,它是完全错误的,没有任何意义。如果你想声明一个指针数组,它是char** arr = malloc(n * sizeof(char*))。这只为指针分配空间,而不是它们所指向的数据。
或者你可以使用可变长度数组(VLA),比如int n=100; char array[n];,但是除了临时存储小对象之外,这不是推荐的做法。VLA经常在堆栈上分配,并且它们的存储时间被限制在声明它的块中。因此,过度使用它们可能会耗尽所有堆栈空间,并且一旦你离开声明它的作用域,它们也会失效。
对于初学者,我建议使用malloc而不是VLA。

nkoocmlb

nkoocmlb2#

回复:如何创建一个动态字符串?"我想动态地创建一个字符串,但是我没有;t像这样使用它:字符串=(字符 *)malloc(100 * 字符大小);
帮我洗洗,但别弄湿我?
如果没有内存分配函数,就没有其他方法来 * 生成动态字符串 *。
语言是工具,如果你发现C语言中的动态分配很复杂,尝试另一种语言(一种能为你做这件事并且有内置字符串类型的语言)。
如果这是不可行的,那么你坚持与良好的旧'malloc()realloc()
但是正如@Lundin所说,永远允许输入是不明智的(POSIX的getline()有一个漏洞),您应该指定一个上限,如果输入超过这个上限,就认为是DOS攻击,并拒绝为攻击者提供服务。

nhhxz33t

nhhxz33t3#

C中的内存分配是相当低级的,容易出错,所以定义更容易正确使用的函数是一个好主意。fgets 的问题是它也读取尾随的换行符,并且它不消耗整行。因此,我通常定义我自己的 ReadLine 函数。下面是静态和动态字符数组的一些方便的声明和示例用法。如果您将声明放在单独的头文件和实现文件中,则可以在所有应用程序中使用它们(像我一样)。

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

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

#define NEW_ARRAY(ptr, n) \
    (ptr) = malloc((n) * sizeof (ptr)[0]); \
    if ((ptr) == NULL) { \
        fprintf(stderr, "Memory allocation failed: %s\n", strerror(errno)); \
        exit(EXIT_FAILURE); \
    }

void ReadLine(char result[], int resultLen)
{
    int ch, i;

    i = 0;
    ch = getchar();
    while ((ch != '\n') && (ch != EOF)) {
        if (i < resultLen - 1) {
            result[i] = ch;
            i++;
        }
        ch = getchar();
    }
    result[i] = '\0';
}

int main(void)
{
    char string[100];
    char *anotherString;
    int anotherStringLen;
    
    printf("Enter string: ");
    ReadLine(string, LEN(string));
    printf("You entered '%s'\n", string);
    
    anotherStringLen = 200;
    NEW_ARRAY(anotherString, anotherStringLen);
    printf("Enter another string: ");
    ReadLine(anotherString, anotherStringLen);
    printf("You entered '%s'\n", anotherString);
    free(anotherString);
    
    return 0;
}

相关问题