C - 动态内存分配

时间:2016-10-24 07:41:55

标签: c pointers

#include<stdio.h>
#include<malloc.h>

int main()
{
    char *string1;
    int length;

    scanf("%d", &length);

    string1 = (char *)malloc(sizeof(char) * length);


    printf("\n Enter the First String : ");
    fgets(string1, length, stdin);

    printf("\n The First String : %s ",string1);

    free(string1);      

    return 0;
}

有人可以帮我解决上述代码吗?我试图获取字符串的长度和字符串作为输入。但是,我只能输入字符串的长度。之后它会跳过字符串输入部分。

这是我得到的输出:

sh-4.3$ main
10

Enter the First String :
The First String :
sh-4.3$

3 个答案:

答案 0 :(得分:1)

  • 输入"10<enter>"后,<enter>"\n"将保留在。{ stdin缓冲区,因此您必须在getchar()之后使用scanf 删除它。

  • 此外,您应该#include <stdlib.h>而不是malloc.h。

  • 由于0终结符,你malloc 1个字符太少了。 string1 = malloc(length + 1);将完成这项工作,演员不会 必要且sizeof(char)始终为1。

答案 1 :(得分:0)

如果您需要使用stdin进行字符串输入,可以使用fgetln。我编辑了你的例子,现在它看起来像那样:

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

int main()
{
    char *string1;
    size_t length;

    //scanf("%d", &length);

    //string1 = (char *)malloc(sizeof(char) * length);


    printf("\n Enter the First String : ");
    //fgets(string1, length, stdin);
    string1 = fgetln(stdin, &length);
    string1[length] = '\0';

    printf("\n The First String : %s ",string1);

    free(string1);

    return 0;
}

注意:fgetln不返回C字符串,您应该在末尾添加一个NULL字符。

答案 2 :(得分:0)

使用换行符等从STDIN /键盘读取时最简单的答案 只是将“\ n”添加到scanf,即:

scanf("%d\n", &length);

解决问题;)

PS:注意scanf

的所有其他安全/缓冲区溢出问题