【问题标题】:how to accept a char * in C using scanf() [duplicate]如何使用scanf()在C中接受char * [重复]
【发布时间】:2016-02-29 22:49:17
【问题描述】:

我正在尝试在 C 中以 char * 的形式输入一个单词

如:

char *inputText;
scanf("%s",inputText);
printf("This is your string %s",inputText);

我尝试过使用

scanf("%s",&inputText);

同样 每次运行时都会出现编译错误或分段错误

"format '%s' expects type 'char *' but argument 2 has type 'char **'

我不确定我是否遗漏了一些非常简单的东西,但这很令人困惑。 我的代码取决于使用 char * 如果有一种方法可以将更简单的输入法转换为 char *,那么你能告诉我那个方法吗?

【问题讨论】:

  • 您无法扫描到空白空间。为inputText 分配一些空间或使用预先分配的数组。
  • 扫描字符串时,您不需要传递char * 的地址...只需传递char * 本身。您还需要确保指针指向某个东西(malloc 空间,或使用数组等)。此外,您应该始终指定宽度,以便 scanf 不会尝试读取长度超过您的空间的字符串。
  • @zenith 我更喜欢这个问题,因为它更重要。那个链接的是“OMGHORRIBLEBLOCKOFCODE”。
  • @MicroVirus 没错,那里可能有更好的副本。

标签: c string char segmentation-fault scanf


【解决方案1】:

您还没有初始化inputText,所以它指向一些您可能甚至不拥有的随机内存。要求 scanf 写入该内存位置会导致未定义的行为。

你需要为指向的指针分配内存:

char *inputText = malloc(amount_of_bytes_to_allocate);

现在inputText 指向分配的内存,scanf 可以愉快地写入该内存位置而不会出现段错误。请记住,使用完分配的内存后,您必须free(inputText)

但最好不要在这种情况下使用动态内存 (malloc),因为您可以很好地使用自动内存:只需将 inputText 声明为 数组 而不是指针:

char inputText[size_of_array];

请记住,您的size_of_array(或amount_of_bytes_to_allocate)必须足够大以容纳scanf 将写入数组的整个字符串,包括终止空字符。否则,您将再次出现未定义的行为。

【讨论】:

  • 如果我无法预测传入的单词/字符串的大小,你会建议我使用 getline() 吗?
  • 也许可以,但请记住这是一个非标准函数。
【解决方案2】:

首先,作为一般预防措施,最好初始化指向NULL 的新指针,以确保它们不指向您的程序不允许访问的内存。

我会使用getline() 作为scanf() 的替代品,尤其是在您输入的大小可以变化的情况下。它会为您分配适当大小的缓冲区,因此您无需担心输入太多字符。

char *inputText = NULL;
int inputSize;

if (getline(&inputText, &inputSize, stdin) >= 0)
   printf("This is your string: %s\n", inputText);
else
   printf("Error\n");

您仍然需要自己释放分配给inputText 的内存,所以不要忘记这样做,并在完成后将其设置为NULL

【讨论】:

  • 只是想知道; &inputSize 在这种情况下如何工作?它是否只是在检查输入大小后为 char * 分配内存,还是有一些极难达到的限制?
  • 该参数是指向int 的指针,用于存储函数读取的字符串的大小。所以它基本上只是计算字符数并将inputSize更新为该数字。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多