【问题标题】:How to enter char* in C?如何在 C 中输入 char*?
【发布时间】:2016-03-17 04:13:34
【问题描述】:

我想为 char* 做一个简单的输入。为什么这不起作用? 它引发了我无法解决的异常..

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

char* GetCharSeq()
{
    char *s = (char*)malloc(100);

    scanf_s("%s", s);

    return s;
}

int main()
{
    char* charseq;

    charseq = GetCharSeq();

    return 0;
}

【问题讨论】:

  • 与您的问题无关,但对于系统头文件,您应该使用尖括号,例如#include <stdio.h>,在 C 中你是 should not cast the result of malloc
  • 如果您遇到异常,也可以发布它
  • 您应该始终检查返回码(例如scanf_s's)。实际的例外是什么?
  • @JoachimPileborg 对于他的例外来说,这可能不是真正的问题。并且铸造也不会造成伤害。
  • @AnishSharma 选角可以造成伤害,这就是问题所在。阅读已接受答案中的第二点。这绝对不是问题的根源,因为我已经添加了一个答案(还要注意评论中关于它与问题无关的起始免责声明)。

标签: c arrays input char scanf


【解决方案1】:

您的代码中有未定义的行为。您拥有它是因为您向 scanf_s 函数提供的参数很少。

对于每个字符串参数,您不仅需要提供目标字符串,还需要提供字符串的大小。所以把你的电话改成

scanf_s("%s", s, 100);

【讨论】:

  • 如何编译/链接不匹配的参数列表?
  • @MartinJames 出于同样的原因,printf("%s"); 将编译和链接。
  • @MartinJames 因为原型中的... 意味着参数的数量是可变的,编译器无法知道确切的数量。一些编译器可以通过解析格式字符串来解决这个问题,并会针对此类问题给出警告,但这只是一个警告,在技术上是合法的 C。
  • scanf_s() 只能在 PC 上编译。他应该使用fgets(),因为这是他想要接收的单个字符串。
【解决方案2】:

修改你的代码

char* GetCharSeq()
{
    char *s = (char*)malloc(100);

    gets(s);

    return s;
}

这会起作用。

【讨论】:

  • 如果您输入的字符不超过 99 个,它会起作用,但正因为如此,它是不安全的!
  • 我们可以将malloc() 参数的值更改为我们想要的任何数字。那不行吗?
猜你喜欢
  • 2015-05-30
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多