C语言中,不能用scanf()函数输入字符串后赋给字符型指针变量?具体请看下面代码中的注释。谢谢!

//形参是指针变量,实参是数组首地址的例子。
//编一个函数,统计并返回形参所指向的字符串长度。
//在主函数中输入字符串,调用该函数统计字符串长度并输出。
#include <stdio.h>
#include <stdlib.h>
extern int charlength(char *ps)
{
int length=0;
while(*(ps+length)!='\0')
{
length++;
}
return(length);
}

void main()
{
char *pc;
printf("请输入一个字符串:");
scanf("%s",pc); //编译时提示这里出错。错在哪里?难道不能用scanf()函数输入字符串后赋给字符型指针变量?

printf("\n\n您刚才输入的字符串%s长度为:%d。\n\n",pc,charlength(pc));

system("pause");
}
由于要存放数据,C语言必须在数据定义语句中先初始化,预先确定存储空间的大小才可以,比如char *pc="abcd"是可以的。

那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?

char *pc; 只是声明了指针,这个指针没有赋值 也就是它指向的地址还不确定
pc没有初始化

改成
char place[256];
char *pc=place;追问

那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?

追答

因为"abcd";在编译的时候分配了一个只读的内存。

你改成
char *pc;
pc="abcd";
还是不能调scanf
此时pc指向的地址的内容是不能修改的
只有我说的那种方式才行

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-09
字符指针pc没有初始化,指向未知内存空间导致的!

改为char *pc=(char*)malloc(sizeof(char)*100);追问

那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?

追答

scanf("%s",pc);//表示从标准输入文件文件中读取一个字符串到以pc为首地址的一段内存中;

char *pc;
pc="abcd";//表示将字符串常量“abcd”写入通常是程序中的只读内存区内,并将其首地址赋值给pc;
以上两个本质上有区别!

第2个回答  2013-01-09
指针必须指向某一定义好的元素,你定义指针后,是不直接分给指针内存的,你的输入语句,系统根本不知道该把值放到哪里,让指针指向某一变量,这样就不会报错了追问

那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?

第3个回答  2013-01-09
char *pc=malloc(100); //声明字符指针,并指向一个100个字节的内存空间。追问

那为什么下面的语句又可以呢?
void main()
{
char *pc;
pc="abcd";
}
指针变量pc初始化时也没有预先确定存储空间呀?

追答

"abcd",在内存中,存储的是一个字符串首地址,不要被外表所迷惑。所以,字符串在表达式中,它是作为一个指针参与运算的。
例1:“xyz”+1; 这行代码看上去像是垃圾,因为它试图在一个字符串上面执行某种类型的加法运算。但是,当你记得字符串常量实际上是个指针时,它的意义就变得清楚了。这个表达式计算“指针值加上1”的值。它的结果是个指针,指向字符串中的第2个字符:y。
例2:printf("%c",*"xyz"); 输出结果:x

第4个回答  2013-01-09
改用c++吧,比这个容易多了

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网