第一种定义
char* name;
scanf("%s",name);
编译虽然正确,运行却会崩溃
第二种定义
char[20] name;
scanf("%s",name);
就可以成功运行
-
关于为什么会崩溃
原因:程序之所以崩溃,是因为scanf会把字符串放到指针所指向的内存那里。但是第一种没有对指针进行初始化。指针就随便指。把字符串放到了一个不该放的地方,程序当然就崩溃了。
解决方法:在两行代码之间插入一行 name = (char*)malloc(32*sizeof(char)) 就好了,那个32可以随便改,那是可以存放的字符个数 -
关于字符串定义
比如:
char *s = “Hello world”
这是可以的,
因为程序会把所有要用到的字符串常量放到静态内存里。然后s指向这块放有此字符串的静态内存的地址里。
但是因为是静态内存,所以里面的内容是不能被修改的。如果你想要可以修改的字符串的话,那就只能char s[5]或用malloc分配动态内存才可以
用字符串初始化后,指针指向的位置是只读的,你向里面写入数据,操作系统是不允许的。 -
关于scanf()
各自的分隔符:
%s:空格、回车、TAB键
%d:空格、回车、TAB键
%c:没有分隔符,上述分隔符都被它当作正常字符对待
也就是说:如果是%s%d,读入数据时碰到的分隔符都会跳过直至碰到第一个非空输入,那么可以不处理’\n’。 -
关于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