各位c语言大佬帮忙看一下这个程序哪里有问题?

# include<stdio.h>

int main(void)
{
void cop(char *a,char *b);
char *from="I love china";
char *to="I am a student";

printf("string from=%s\nstring to=%s\n",from,to); //输出字符串

cop(from,to); //调用cop函数把from中的字符逐个复制到to中
printf("string to=%s",to); //输出复制后的字符串

return 0;
}

void cop(char *a,char *b)
{
for (;*a!='\0';a++,b++)
*b=*a;
*b='\0';
}
把char *to="I am a student";改成char arr[]="I am a student";char *to=arr;程序就没问题了,这是为啥?

字符串字面值常量不可以修改。而字符数组可以修改。

养成将字符串字面值常量声明为const的好习惯,可以避免你犯这样的错误,因为试图修改会在编译时就报错。

const char *from="I love china";  // 字符串字面值常量不可以修改,声明为const

char from[]="I love china";  //字符数组可以修改

追问

我这里from和to是指针变量呀,为什么是常量。在后面cop函数的定义里面是让形参a,b作自加,也就是指针进行的自加,没有对常量进行修改,而且他也没报错,但是cop函数没结果。像下图把“I am a student”赋给字符数组arr[],再把arr赋给to他是可以完成的。可是不管是直接

char *to="I am a student";

还是

char arr[]="I am a student";

char *to=arr;

他们两不都是把字符串的初始地址赋给指针变量to吗?搞不懂。

追答

用双引号引起来的内容,就叫做字符串字面值常量。"I am a student"就是一个字符串字面值常量。
char *to="I am a student"; 定义一个指针to,令它指向字符串字面值常量"I am a student"的首地址。这种写法是不规范的,因为用户可以通过指针to修改其指向的内容,这违背了字符串字面值常量不可修改的原则,可能导致程序运行时异常(也就是你的程序崩溃的原因)。因此,规范的写法应该是const char *to="I am a student"; 将指针to定义为常量指针,杜绝了用户通过该指针修改其所指内容的可能性。

追问

明白了,谢谢大佬。

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-08-12
你的代码在vc++6.0中可以运行;在vs2017中提示要加const,估计与c11标准有关追问

我刚开始学,c11要求了我就照着做吧,但是现在的问题和c11没什么关系,在VC++6.0都没搞懂的问题。

追答

我建议你加const,c语言二级辅导书里面说不加const合法.(在vc++6.0中的确是这样)但在vs2017中,必须加const,因为char *a="wwww";这里wwww的类型是const char *类型.就会报错

追问

好的,记住了,谢谢。

大佬帮忙看看这个程序错在哪了,刚学C语言?
int main(){int price=0; \/\/该处由‘,’改为‘;’printf("请输入金额(元) :") ;\/\/该处缺少分号scanf("%d",&price);int change=100-price;printf("找您%d元。\\n",change);return 0;} 运行结果如下:

各位大神,请帮忙看一下下面这个程序什么地方出错了,目的是求商和余数...
} 因为你的scanf里面的“”里面有逗号.你在控制台输入得时候两个数据间没有打逗号。这是我写的你试试 while(1);是为了不闪屏 其余的你自己补充。这是关键的代码。

完数问题,请大佬帮忙看一下这代码哪里有问题。
你的求1000以内完数的C语言程序,我帮你改完了,你看看吧(改动的地方见注释)include<stdio.h>int main(){ int i,j,k=0; for(i=2;i<1001;i++) { k=0;\/\/这里加一句,k在每个数判断前要置0 for(j=1;j

c语言这段代码到底哪里有问题,错误显示: 缺少“;”(在“类型”的前面...
你的图片上的程序代码把主函数main写到BracketMatch函数中了,所以需要把主函数最后的大括号移到主函数前面,从而让主函数在BracketMatch函数外面.具体的移动位置见下图中注释

求C语言编程大佬帮忙!这道题的逻辑哪里出错了!找了几个小时了没搞明白...
思路如下:这个问题实际上是生成0~9的全排列,然后根据每个数在格子里的位置判断每个排列是否符合要求。百度了一个全排列算法稍做修改,得到以下代码,输出的有效方案数是1580,在我这里输出大约在70ms到100ms左右。百度这个代码排版垃圾得无以复加,vs里面排得好好复制过来全乱,不再重排了。另外,生成...

请各位大神帮忙看看这个程序,错在哪,出现这个underclared identifier...
评论 收起 你很聪明 2016-10-16 · 超过13用户采纳过TA的回答 知道答主 回答量:33 采纳率:0% 帮助的人:4.4万 我也去答题访问个人页 关注 展开全部 sum没有被定义,sum不属于C语言保留字 。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 其他类似问题2013...

请帮忙看一下这个程序哪里有问题 提示说fatal error C1004: unexpected...
scanf("%f",x);函数错误,应该用&x。scanf函数需要地址参数。

请问一下大佬们,这道C语言编程题我为什么错,还有这些监测点的划分依据是...
这段代码的问题在于图中红色框内jc数据类型不合适,不能定义为int,需为double。解释:C语言中一般int为32位,最大只能表示12的阶乘,超过12就会产生溢出,而题目中明确说明了数据会在double范围内,就是有可能超过int所表示范围。需要改为double类型。监测点划分依据:Cmn表示从n中选m个有多少情况,...

c语言,二元一次方程求解,大佬们帮我看看哪里出了问题
你算的时候,循环里面X1和X2不能是++,如果解是小数的话,比如3.2,那么那你的X1从3就直接到4了,就没有到过3.2

求c语言大佬解惑,以下程序爆出错误[Error] 'ss std [3]' redeclared as...
int age;char sex;} std1[3], *p = std1;\/\/std应该是和C++的命名空间名冲突了 main() { scanf("%d", &(*p).age);scanf("%s", std1[0].name); \/\/字符串名就是地址,不用加&(取址符)scanf(" %c", &std1[0].sex);scanf(" %c", &(p->sex));\/\/输出 printf("%d\\n...

相似回答