如何使用字符指针并在其中输入字符串?

时间:2019-02-07 15:48:17

标签: c scanf

有什么办法可以不用使用动态内存分配吗?

#include <stdio.h>

int main() {
    char* str = NULL;
    scanf("%s", str);
    printf("%s\n", str);
}

3 个答案:

答案 0 :(得分:6)

根据C标准(C11)没有简单的方法,但是,POSIX defines可选的分配分配字符m作为转换说明符的一部分,使程序员摆脱了分配内存的责任。

但是,实际上,这确实使用了动态内存分配,因此您稍后需要在指针上调用free()

引用参考:

  

%c%s%[转换说明符应接受可选的分配分配字符'm',这将导致分配一个内存缓冲区来保存转换后的字符串,包括终止的空字符。在这种情况下,与转换说明符相对应的参数应该是对指针变量的引用,该指针变量将接收指向分配的缓冲区的指针。系统将分配一个缓冲区,就好像已调用malloc()一样。应用程序应负责在使用后释放内存。如果没有足够的内存来分配缓冲区,则函数应将errno设置为[ENOMEM]并导致转换错误。如果函数返回EOF,则在函数返回之前,应释放通过调用成功使用分配分配字符'm'为参数分配的任何内存。

类似

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

int main() {
    char* str = NULL;
    scanf("%ms", &str);
    printf("%s\n", str);
    free(str);

    return 0;
}

会做这份工作。

答案 1 :(得分:0)

这种方式:

int main()
{
  char str[100];
  scanf("%s", str);
  printf("%s\n", str);
}

答案 2 :(得分:-1)

是的,但是您将浪费内存,否则就有违反段关联的风险:

const { foo: [ firstFoo ], bar: [firstBar ]} = x;