字符串输入问题

第一种定义

char* name;
scanf("%s",name);

编译虽然正确,运行却会崩溃

第二种定义

char[20] name;
scanf("%s",name);

就可以成功运行

  1. 关于为什么会崩溃
    原因:程序之所以崩溃,是因为scanf会把字符串放到指针所指向的内存那里。但是第一种没有对指针进行初始化。指针就随便指。把字符串放到了一个不该放的地方,程序当然就崩溃了。
    解决方法:在两行代码之间插入一行 name = (char*)malloc(32*sizeof(char)) 就好了,那个32可以随便改,那是可以存放的字符个数

  2. 关于字符串定义
    比如:
    char *s = “Hello world”
    这是可以的,
    因为程序会把所有要用到的字符串常量放到静态内存里。然后s指向这块放有此字符串的静态内存的地址里。
    但是因为是静态内存,所以里面的内容是不能被修改的。如果你想要可以修改的字符串的话,那就只能char s[5]或用malloc分配动态内存才可以
    用字符串初始化后,指针指向的位置是只读的,你向里面写入数据,操作系统是不允许的。

  3. 关于scanf()
    各自的分隔符:
    %s:空格、回车、TAB键
    %d:空格、回车、TAB键
    %c:没有分隔符,上述分隔符都被它当作正常字符对待
    也就是说:如果是%s%d,读入数据时碰到的分隔符都会跳过直至碰到第一个非空输入,那么可以不处理’\n’。

  4. 关于scanf(%s)和gets()
    char string[15];
    gets(string); /遇到回车认为输入结束/
    scanf("%s",string); /遇到空格认为输入结束/
    字符串后都会加上’\0’
    **scanf :**当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
    **gets:**可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

详情参考以下文章:
https://tieba.baidu.com/p/5079969028

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值