【问题标题】:How can I use a character pointer and input a string into it?如何使用字符指针并在其中输入字符串?
【发布时间】:2019-02-07 15:48:16
【问题描述】:

我有什么方法可以做到这一点使用动态内存分配?

#include <stdio.h>

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

【问题讨论】:

  • 是的,您可以使用静态分配,例如char str[100];
  • 这听起来像XY Problem

标签: c scanf


【解决方案1】:

根据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;
}

会做的。

【讨论】:

【解决方案2】:

这边:

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

【讨论】:

  • 如果用户输入一百个或更多字符会怎样?
  • @ryyker 在问题标题之后,OP 要求不使用动态内存分配的解决方案? 所以...
  • Sourav 的回答很简洁,但仍然在后台使用动态内存分配。
【解决方案3】:

是的,但是你会浪费内存,或者有违反segmentanltion的风险:

#include <stdio.h> 
int main() { 
     char str[512] = {0} // as suggested by Jabberwocky
     //sprintf(str, "");
     //scanf("%s", str); // protecting the input from more than 511 chars
     scanf("%511s", str);
     printf("%s\n", str); 
}

【讨论】:

  • 您能解释一下风险吗?有什么解决方法吗?也许可以调用另一个函数来输入字符串?
  • 为什么是sprintf(str, "");?为什么不str[0] = 0;char str[512] = {0};。如果用户输入超过 511 个字符的字符串怎么办?
  • 因此将 scanf 的输入限制为固定数量的字符。或者最好使用 fgets。或者更好的是,忘记使用 stdio.h。
  • 如果输入大于“缓冲区大小”(例如,511 个字符 + 结尾 \0),您将尝试访问未分配给您的进程的内存,以及一个 SEGV(分段违规)会发生。你可以限制输入,使用scanf("%511s", str);
  • 习语sprintf(str, ""); 或建议的str[0] = 0 在这段特定的代码中是不必要的;无论如何,sprintf 版本似乎更容易理解。关于限制,我已经更新了我的建议答案。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多