中易网

问几个C语言里很多人没注意过的问题

答案:6  悬赏:80  
解决时间 2021-01-17 11:36
  • 提问者网友:喧嚣尘世
  • 2021-01-16 13:59
问几个C语言里很多人没注意过的问题
最佳答案
  • 二级知识专家网友:从此江山别
  • 2021-01-16 14:35
说实话要是这几个问题只要理解了C语言的人,怎么可能不明白。很多人没注意,说明他们还没学懂。当然我也不是在自夸,我也是初学者,可是我还是为楼上几位悲哀。
1.你要知道程序在内存中的结构,有栈区、堆区、文字常量区、全局变量区、函数区,使用
char* a = "xxx";
这样的语句初始化指针a,"xxx"将被存储在文字常量区,那么a就是一个指向文字常量区的指针,怎么可能允许你用scanf更改。别说更改,就是使用指针自加都不可以。
2.别说定义在结构体里面,就算你定义在外面,你试试下面能行不
char name[20];
name = "xxx";
name变量它是一个指针,你把一个文字常量赋值给指针是何用意?
要知道char name[20] = "xxx"只是数组的特殊赋值方式罢了。
确实要这样赋值,可以用memcpy
memcpy(name, "xxx", 3*sizeof(char));
3.你这句话是正确的。只要fp正确无误的打开了一个文件,而且文件中确实有数据,那么fscanf就一定会为你读入数据,只不过要记得fscanf这个函数遇到空格、回车等就会终止,所以不一定会读文件读到哪。
4.很遗憾,C标准并没有为int型数据指定几个字节,各编译器都有自己的实现。在MSVC上默认int为4字节,而早版本的TurboC却是两个字节。这也是为什么在"Google编程分割指南"里面推荐使用stdint.h头文件中长度确定的基本类型,比如int16_t, uint32_t, int64_t,它一定会是2字节、4字节、8字节,方便各平台下的移植。

能帮到你就好,我也不稀罕那点分了。不懂缺为了那点分而误人子弟,那罪过才大了。追问第三个int flag=fscanf(fp,"%s",ch)要是改成int flag=fscanf(fp,"%s",pch)是不是就不对了,另外就算写成这样,前面的指针还是没用啊追答即便是改成你这样,也是对的。我不知道你指哪个指针没用,是flag?他也的确是没用,他指的是第二项之后参数的个数,在本例中没有意义。追问第二个:那么找个指针,让它指向name行不行,比如char* a;a=name这样行不行追答当然可以。可能稍有不同的是,name做为一个指向数组头的指针,是可以取其大小的sizeof(name)。使用指针指向它之后,sizeof(a)显示的只是指针的大小了。
全部回答
  • 1楼网友:不想翻身的咸鱼
  • 2021-01-16 18:22
1,常量是不可变的。
2,c语言表示字符串其实是以NULL结尾的字符 数组,不能那样赋值。
3,文件以读的方式正确打开,是可以读入字符串的。看看问题是不是出数据大小上。
4,数据类型的空间大小好像只与编译器有关。
  • 2楼网友:污到你湿
  • 2021-01-16 17:20
第一个是因为你没给指针变量赋初值,a在系统里是没有地址的。
第二个的话如果a是指针的话是不行的。
第三个的话看不懂你在写什么。
第四个我不懂。不好意思。
  • 3楼网友:神的生死簿
  • 2021-01-16 16:48
1. 你定义的a是一个指向char类型的指针 而在scanf函数中对应的表达式却是%s字符串 类型不同所以不行
2.你定义的是一个字符数组,不是一个string字符串,所以赋值只能采用数组的赋值形式,比如做一个i的循环向name[i]中输入数据,或者用{ }的形式初始化,若定义为string name 就可以用等号进行赋值了,不过也就不是C语言了~
3.没看明白你这些句子是要干啥,你要就是要把文件载入内存定义一个FILE *fp,然后用fopen函数打开文件就好,你如果没打开文件的话自然什么都不会有
4.奔三装64位系统如果你用32位IDE的话int范围是32位,64位IDE就是64位,只不过用64位IDE写出来程序后奔三运行不了而已。同样一个64位处理器装32位系统由于只能使用32位IDE环境所以建立的int就是32位的。
希望能够帮到你
  • 4楼网友:猎心人
  • 2021-01-16 16:15
1、字符串常量只可读,不可写。scanf("%s",a); 的话就是往a里写字符串了,但是a是字符串常量,所以这样肯定不行。
2、数组无法一次性赋值,除非是在初始化的时候。所以 a.name="xxx" 是不行的,因为它是在被定义之后尝试一次性赋值。必须在初始化的时候一次性赋值。如:struct test{ char name[20]} a={"xxx"}; 这样是可以的。这样是将结构体初始化,自然也将 结构体的成员 name初始化了。
3、fscanf遇到回车符就会返回,所以,你只可能读到1行,甚至只能读到一行只有回车符号的空行。读文件要用 fread。如:int flag=fread(ch,100,1,fp);
4、int大小跟CPU没关系,而是跟系统有关系。而实质上跟编译器有关。编译器编译出来的64位程序里,int 是64位, 64位的系统里,int当然是64位了。而如果一个64位的CPU跑32位的系统,int自然只能是32位了。
  • 5楼网友:山有枢
  • 2021-01-16 14:55
(1) char* a;因为 a 是指针,没有数据存放单元,所以 scanf("%s",a) 不行。你可以动态分配:
a = (char*)malloc(sizeof(char)*100); 或让它指向一个已开的数组:char v[100]; a = &v[0];
(2) a.name="XXX" C语言,没有字符串赋值语句,要用函数 strcpy(a.name,"XXX");
(3) 你还没有 fopen.
另外 fscanf(fp,"%s",ch); 读到第一个分隔符“空白”(空格,tab, "\n" ...) 就不读了。
用下面方法可以读一行:
char ch[100];
char* pch; int i=0; int flag;
FILE *fp;
pch=ch;
fp = fopen("abc.txt","r");
fgets(ch,100,fp);
printf("%s",pch);
(4)计算机用虚拟存储,所以可以开很大的空间,只要编译器不报错,你可以开得比内存还大。
int 的大小 用 sizeof(int) 测定。追问不对啊,我记得在linux的gcc下执行此代码生成的可执行文件,编译运行再用cat打开,字符一个没少就是少空格,回车
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息