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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问几个C语言里很多人没注意过的问题相关的知识,希望对你有一定的参考价值。

1.先定义一个指向字符串常量的指针char* a;然后scanf("%s",a)这样写就不行。为什么?
2.先定义个有字符串的结构体a,这结构体里有char name[20],以后再写a.name="XXX"也不行,为什么?
3.char ch[100];
char* pch;
int i=0;
pch=ch;
int flag=fscanf(fp,"%s",ch);我这么写以后原想用程序把文件载入内存,结果P都没有,又为什么?
4.理想情况下,奔3装64位系统的机器和一台athlonX64装32位系统的机器分别能给int开多大的空间

本人已经用了个分最多的账号提问了,奖金也是最高的,解释的好再有奖

说实话要是这几个问题只要理解了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)显示的只是指针的大小了。

参考技术A (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打开,字符一个没少就是少空格,回车

参考技术B 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位了。
参考技术C 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位的。

希望能够帮到你
参考技术D 第一个是因为你没给指针变量赋初值,a在系统里是没有地址的。
第二个的话如果a是指针的话是不行的。
第三个的话看不懂你在写什么。
第四个我不懂。不好意思。
第5个回答  2012-03-17 1,常量是不可变的。
2,c语言表示字符串其实是以NULL结尾的字符 数组,不能那样赋值。
3,文件以读的方式正确打开,是可以读入字符串的。看看问题是不是出数据大小上。
4,数据类型的空间大小好像只与编译器有关。

Python安装需要注意的几个小事项...

  印象中对Python语言的初识,还是在大学时期,走廊画板上做了一个对Java、C、Python等语言的对比图,当时大概意思是Java最屌丝,Python则是高富帅,也是玩笑而已,毕竟大家对Python的熟知度不如Java。如今工作之后,也是对Pthon有了真正的认识,但我不会在这里将很多理论,因为你能找到这篇文章,就不需要我来介绍Python了,在这我会把我遇到的问题分享出来,供自己或网友借鉴。

  首先,当然是安装问题,第一步,你需要去官网下载Python的安装包,网址是:https://www.python.org,最好选择2.7版本的,因为3.3版本不支持某些第三方库;

第二,打开安装程序,进行安装,过程很简单,默认下一步就可以了;第三,设置环境变量,我的电脑--右键属性--高级系统设置--环境变量--PATH:加上C:\\Python27;

打开widows命令提示符窗口,输入Python,如图所示,则安装成功

技术分享

  如果此时仍然提示Python不是内部或外部命令提示符,则需要检查下环境变量里的PATHEXT是否配置了.exe,如果没有,则加上就可以了

                                                      ------------我是灵蟒

 

以上是关于问几个C语言里很多人没注意过的问题的主要内容,如果未能解决你的问题,请参考以下文章

头文件里的大学问,C语言需要注意这些原则...

如何学习C++(多问几个为什么)

问几个java小问题

C语言规范第一个花括号可以不独占一行吗?

C语言规范第一个花括号可以不独占一行吗?

c语言中strstr函数的一个注意点