|
5鱼币
- #include <stdio.h>
- int main()
- {
- char chr[2][10];
- chr[0] = "黑桃";
- chr[1] = "红桃";
- printf("%s\n%s\n", chr[0], chr[1]);
- return 0;
- }
复制代码
- #include <stdio.h>
- int main()
- {
- char chr[2][10] = {{"黑桃"}, {"红桃"}};
- printf("%s\n%s\n", chr[0], chr[1]);
- return 0;
- }
复制代码
为什么上面代码不行啊?报错如下
- assignment to expression with array typ
复制代码
顺带问一下,我在fishc写日志,tab键不是缩进,而是在切换选中的按钮?但是写帖子tab就是缩进。
还有,C语言里有像python中字符串的format方法吗?在C里面是不是得自己写函数实现啊???
本帖最后由 AnisHan 于 2022-4-15 11:35 编辑
对于字符数组你需要使用指针数组而不是二维数组,声明这样写char szBuffer[] = "";可以,但是赋值就有问题。因为数组不能直接赋值.
你应该也知道int a[] = {1, 2, 3} int b[3] = a这么写是错的吧,数组是一个常量指针(数组确实是这么指向内存的,你这么想就行了,实际上肯定还是要复杂得多),你不能直接把数组原本指向的指针硬改成指向“字符串常量池:的指针(字符串一般是以\0结尾的数组你应该知道吧,数组传值的时候是地址传递值不是数组里的值传递,“xxx” 这样声明的字符串是在字符串常量池中的)你这种写法就是用字符串常量池中的字符串数组地址替换掉要赋值数组的地址,很明显这样乱搞会导致程序结构很乱,内存空间也是指来指去乱七八糟,所以c语言不允许
解决:请这么写
char *szStrArr[10]; //这个指针数组,因为指针可以改随便改指向的内容的
关于格式化字符串: sprintf(char * buffer, char * format, ...)(参数名字自己起的,类型可能多个const什么的,但是不重要)或者wsprintf(参数较为“特殊”不是很好写)具体使用方法你百度一下就知道了,和printf用法很类似,wsprintf是通用字符版本,一般这两个函数都有溢出风险(可以修改你函数跳转地址,注入并且执行恶意代码的函数),解决就是vs可以用 strsafe.h 的 StringCchPrintf,具体方法百度吧。
还有就是,建议中文使用宽字符,普通字符串可能会导致乱码,比如文档是UFT-8编码的你的系统是GBK的,那就可能乱码了,如果文档和系统(就是说shell/console)都是一种编码那就不会乱码
还有理论上你第二个那种写法应该是可以的
|
最佳答案
查看完整内容
对于字符数组你需要使用指针数组而不是二维数组,声明这样写char szBuffer[] = "";可以,但是赋值就有问题。因为数组不能直接赋值.
你应该也知道int a[] = {1, 2, 3} int b[3] = a这么写是错的吧,数组是一个常量指针(数组确实是这么指向内存的,你这么想就行了,实际上肯定还是要复杂得多),你不能直接把数组原本指向的指针硬改成指向“字符串常量池:的指针(字符串一般是以\0结尾的数组你应该知道吧,数组传值的时候是地址传 ...
|