目录
一、const类型限定符
二、字符处理函数
三、数值字符串向函数值转换
一、const类型限定符
通过采用指针或数组作函数参数,可使调用者获得修改后的数据,但有时我们只希望将数据传到被调函数的内部,而并不希望它们在函数内被修改,此时,为了防止数据被意外修改,也为了让函数功能更明确(明确表示程序员的意图,不希望它们被修改),可使用const对参数进行限定。
例如:
unsigned int mystrlen(const char str[]);
或者
unsigned int mystrlen(const char *pstr);
事实上,当声明一个指针变量时,这个指针变量本身的值以及它所指向的数据都可以被声明为const。const位于声明语句中的不同位置,将表示不同的含义。
1、const放在类型关键字的前面
假设有如下变量声明语句:
int a,b;
const int *p=&a;
按照从右到左的顺序,可将这条变量声明语句读作:“p是一个指针变量,可指向一个整型常量(Integer Constant)”。它表明*p 是一个常量,而p不是。 由于*p是只读的,是不可以在程序中被修改的,所以一旦将*p作为左值在程序中对其进行赋值,将被视为非法操作。
注意:虽然这里*p的值是不可修改的,但p指向的变量a的值仍是可以修改的,即对a执行赋值操作是合法的。因指针变量p的值是可以修改的,所以这里如果执行赋值操作p=&b也是合法的,经过这个赋值之后,指针变量p不在指向变量a而是指向变量b了。
#include <stdio.h>
int main(void)
{
int a,b;
const int *p=&a;
a=10;
b=20;
printf("%p......%d\n",p,*p);
p=&b;
printf("%p......%d\n",p,*p);
}
(2)const放在类型关键字的后面和*变量名的前面
int const *p = &a;
按照从右到左的顺序,可将这条变量声明语句读作:“p是一个指针变量,可指向一个常量整数(Constant Integer)”。它表明*p是一个常量,而p不是。由于*p是只读的,所以不能使用指针变量p修改这个“为常量的整数型”,他和第一种情况是等价的。、
(3)const放在类型关键字*的后面,变量名的前面。
int * const p = &a;
按照从右到左的顺序,可将这条变量声明语句读作:“p是一个指针常量,可指向一个整型(Integer)数据”。它表明p是一个常量,而*p不是。由于p是一个常量指针,是只读的,其值是不可被修改的,所所以在执行程序中不能修改指针p,让他指向其他变量。
出现报错。
虽然改变不了地址,但是可以改变该地址下的数值。
(4)一个const放在类型关键字之前,另一个const放在类型关键字*之后和变量名之前。
const int * const p = &a;
按照从右到左的顺序,可将这条变量声明语句读作:”p是一个指针常量,可只想一个整型常量(Interger Constant)“。它表明p和*p都是一个常量,都是只读的。这是,无论执行*p = 20;
还是执行p=&a这样的操作,都将被视为非法操作。
(pb是我自己顶一个,与p含义相同,可视为p ,上面的pa意义一样。)
强行修改出现了报错。
二、字符处理函数
字符处理函数库中包含了对于字符数据进行测试和操作的标准函数库,使用这些函数库需要程序开头包含头文件<ctype.h>
例题:输入一行字符,统计其中的英文字符,数字字符、空格和其他字符的个数。
方法1:不使用ctype.h
#include <stdio.h>
//#include <ctype.h>//隐藏去不使用
#define N 80
int main(void)
{
char str[N];
int i,letter = 0,digit = 0,space = 0,others = 0;
printf("Input a string:");
gets(str);
for(i=0;i<str[i]!='\0';i++)
{
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')
letter++;
else if(str[i]>='0'&&str[i]<='9')
digit++;
else if(str[i]==' ')
space++;
else
others++;
}
printf("English character :%d\n",letter);
printf("digit character:%d\n",digit);
printf("space : %d\n",space);
printf("other character:%d\n",others);
return 0;
}
方法2:使用ctype.h 只需将for循环里的修改即可。
if(isalpha(str[i]))
letter++;
else if(isdigit(str[i]))
digit++;
else if(isspace(str[i]))
space++;
else
others++;
例题:输入名字,首字母为小写,修改首字母为大写。
#include <stdio.h>
#include <ctype.h>
#define N 80
int main(void)
{
char name[N];
int i;
printf("Input a name:");
gets(name);
i=0;
while(!isalpha(name[i]))
{
i++;
}
name[i] = toupper(name[i]);
while(!isspace(name[i]))
{
i++;
}
while(!isalpha(name[i]))
{
i++;
}
name[i]=toupper(name[i]);
printf("Formatted Name :%s\n",name);
return 0;
}
三、数值字符串向数值的转换
字符串与整型数值在内存的存储方式上有很大不同。字符串中的每个字符都是以ASCII码形式存储在一个内存单元中,占一个字节存储空间。而整型数是以二进制形式存储的。
C语言提供的字符串转换函数可将数字字符串转换为整型或浮点型的数值。使用这些函数时,必须包含头文件<stdlib.h>。
例题:演示字符串转换函数。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[]={" 123.5"};
int intNum;
long longNum;
double doubleNum;
intNum=atoi(str);
longNum=atol(str);
doubleNum=atof(str);
printf("intNum=%d\n",intNum);
printf("longNum=%ld\n",longNum);
printf("doubleNum=%f\n",doubleNum);
return 0;
}
如果在编译时出现,无法运行,可以修改为这个(Dev_c++是这样的)