C语言字符串问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言字符串问题相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <ctype.h>
void main (void)
char *s = "fasef";
char a[10] = "fasef";
int i;
for (i = 0; i < strlen(s); i++)
a[i] = '*'; /*为什么能给它赋值*/
for (i = 0; i < strlen(s); i++)
s[i] = '*'; /*不能给它赋值*/
printf("%s",a);
printf("%s",s);
getch();
我感觉是因为字符串是常量指针,但是不知道怎么解释,
高手赐教
今天上C语言课老师也举了个类似的例子
char *s = "fassd";
*(s + 2) = 'A';
下课我就去质疑老师,结果遭鄙视了,回来又试了一下
结果 vs2008和MinGW Developer Studio都报错,TC倒是能通过,
指教啊!!
分别是静态区、栈区、堆区、代码区。
全局变量、静态变量、常量均存放在静态区。
局部变量、参变量均存放在栈区。
运行中申请即动态开辟的空间存放在堆区。
代码放在代码区。
char *s = "fasef";
char a[10] = "fasef";
以上两句,指针s和数组a在栈区,s占4个字节,因为是指针类型变量。a占10个字节,因为是10个char型变量数组。"fasef"存放在静态区的常量区,占6个字节,因为是字符串。
"fasef"可以作为字符串的首地址。
明确了以上关系,我们可以看到
s指针被赋值,实际上是指向了静态区的"fasef"。数组就不同,它是用自己的栈区空间存放了"fasef",一共6个字节。
1.a[i] = '*'; /*为什么能给它赋值*/
因为数组a自身在栈区有自己空间,可以赋值。这是数组的特性。
2.s[i] = '*'; /*不能给它赋值*/
因为s是指针,没有分配空间,不可以这样赋值。s指针指向一个地址。申请空间就是给s一个空间的地址,这个空间可以用来存放数据。也可给s一个常量的地址,它就指向常量。但是,我们知道字符串常量是不可以改变的,所以这样就错了。
3.char *s = "fassd";
*(s + 2) = 'A';
这样肯定不错,会造成内存错误。s没有申请空间,如何下移赋值!
补充:楼下这兄弟所言不可信。这种赋值是要出大问题的,从内存的角度讲,是内存泄露,要是真在应用中,这是要出事故的。未申请空间的指针要是都这般赋值,那就乱了。绝对通不过编译。 参考技术A "所有的都想知道"回答的不错.
只声明了指针的字符串是静态的,是常量,确实没法修改.
但作为字符数组的初始化值,被赋给字符数组时,就是变量了 参考技术B char *s = "fasef";
char a[10] = "fasef";
s被初始化指向了字符串"fasef"的地址,指针s并没有分配内存
a[10]已经分配了10个char型地址,然后被赋值fasef
如果老师告诉你这样,先鄙视老师然后再质疑他 参考技术C char *s = "fasef";
常量字串不允许被修改.
所以,程序挂掉了也别著急
换成数组就可以了 参考技术D char *s = "fasef";
s指向了字符串"fasef"的地址,指针s并没有分配内存 ,
但是a已经被分配到了10个char型存储空间。然后被fasef初始化了。
所以不能给s赋值,而能给a赋值的。 第5个回答 2009-04-20 这个问题我们老师提过,他说:不同的编译系统处理的方法不一样,有的编译系统可以这样赋值,有的则不可以,给字符指针赋值的时候最好这样做:另定义char *p=s;p++;*p='a';
也就是用指针自加实现赋值。
c语言double类型输出问题及字符输入问题
#include<stdio.h>
void main()
double x;
char str[10],ch;
/*以下为输入一个double类型的数*/
scanf("%f",&x);
printf("%f\n",x);
/*问题1:以上结果为什么输出了一个随机数??*/
/*以下为输入一个字符串*/
scanf("%s",str);
/*以下为输入一单个字符*/
/*问题2:为什么没有相应的输入中断???*/
scanf("%c",&ch);
printf("%c\n",ch);
/*问题3:以上输出结果为什么单个字符没有被赋值???*/
printf("%s\n",str);
问题在以上程序注释中
编译环境是VC++6.0
你输入字符串时,肯定按了回车,而回车实际上输入了2个字符,第1个被用来确认scanf结束,还有一个仍然保留在了缓冲区内,被scanf("%c",&ch);读到了,这个字符是个控制字符,所以不可见.
在任何读取字符的语句之前,你最好用fflush(stdin);来清空一下缓冲区. 参考技术A #include<stdio.h>
void main()
double x;
char str[10],ch;
/*以下为输入一个double类型的数*/
scanf("%lf",&x);
printf("%lf\n",x);
/*%f改成%lf OK*/
/*以下为输入一个字符串*/
scanf("%s",str);
/*以下为输入一单个字符*/
/*scanf遇到空格或者回车自动结束*/
getchar();/*加一个用来存储回车键就OK或者fflush(stdin); 也可以*/
scanf("%c",&ch);
/*因为回车键也是一个字符。所以你在输完字符的时候回车的时候。他会把他当成字符存储到ch。你看一下你的是两行空格加两行\n是四行空格。*/
printf("%c\n",ch);
/*问题3:以上输出结果为什么单个字符没有被赋值???*/
printf("%s\n",str);
不懂可以hi我
以上是关于C语言字符串问题的主要内容,如果未能解决你的问题,请参考以下文章