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

double要用%lf

你输入字符串时,肯定按了回车,而回车实际上输入了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语言字符串问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言空字符串的问题;

c语言问题-把数字转换为字符数组

C语言中字符统计问题

linux c语言字符串比较问题

C语言问题 字符(串)替换

C语言sprintf问题