目录
1.sizeof()和strlen()的区别:sizeof():以字节为单位返回其整个长度的大小(总),在编译阶段便开始起作用适用于绝大多数类型;
3.输入5个国家的英文名称,按字母排序输出 Eg: 输入:Spain China Italy Germany French输出: China French Germany Italy Spain
5.输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。编写转换函数chnum。
6.请编写一个函数func, 用来删除字符串中的所有空格。 例如, 输入asd af aa z67, 则输出为 asdafaaz67。
1.sizeof()和strlen()的区别:
sizeof():以字节为单位返回其整个长度的大小(总),在编译阶段便开始起作用适用于绝大多数类型;
strlen():测试字符型数组的长度,其他类型不可以,遇见 ‘\0’ 终止(实际),即求已存在的长度;
/*===============================================
* 文件名称:1.c
* 创 建 者:
* 创建日期:2022年04月08日
* 描 述:
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
char s1[10] = "abcd!";
char *s2 = "\n123\\";
// 指针 占八个字节
char *s3 = "\n";
// 指针
char s4[10] = "\n123\\";
// \n 一个字符,转行
// \\ 一个字符,反斜杠+转义字符
printf("strlen(s1)=%d,sizeof(s2)%d\n",strlen(s1),sizeof(s2));
printf("sizeof(s1)=%d\n",sizeof(s1)); //若,初始化不对,及其容易造成野指针
printf("sizeof(s3)=%d\n",sizeof(s3));
printf("strlen(s4)=%d\n",strlen(s4));
return 0;
}
野指针:指针未初始化或全部初始化。
root@ubuntu:/C# ./a.out
strlen(s1)=5,sizeof(s2)8
sizeof(s1)=10
sizeof(s3)=8
strlen(s4)=5
2.存储溢出
char p = 255; //有符号字符存储长度 -128~127
注意:不要错认为是先将等号右边算完(包含自增自减),再赋值给左边。实际上也是将等号右边算完,在赋值给等号左边,但是自增自减例外
自增自减:先拿来使用,再加1或者减1
这里也要考虑优先级,具体需要读者自己体会!!!
/*===============================================
* 文件名称:111.c
* 创 建 者:
* 创建日期:2022年04月08日
* 描 述:
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=1,b=0;
char c,d;
c = 255;
// 字符占一个字节,即八个二进制位(加一个符号位)
// c溢出,但是既然存储了,只能将符号位拿来使用
// 但是机器不一样,既然符号位是1,就认为该数是负数,自动取反加一
b = a++;
printf("c:%d\n",c++);
//因此这里输出 -1
d = c++ + 1;
printf("d:%d\n",d);
printf("b:%d\n",b);
return 0;
}
root@ubuntu:/C# ./a.out
c:-1
d:1
b:1
3.输入5个国家的英文名称,按字母排序输出
Eg:
输入:Spain China Italy Germany French
输出: China French Germany Italy Spain
6 * 输入5个国家的英文名称,按字母排序输出
7 Eg:
8 输入:Spain China Italy Germany French
9
10 输出: China French Germany Italy Spain
11 ================================================*/
7 #include <stdio.h>
8 #include <string.h>
9 int main(int argc, char *argv[])
10 {
11 char str[][10]={"Spain","China","Italy","Germany","French"};
12 int i,j;
13 char temp[10]={0};
14 int n=sizeof(str)/sizeof(str[0]);
15 for(i=0;i<n;i++){
16 printf("%s ",str[i]);
17 }
18 printf("\n");
19 for(i=0;i<n-1;i++){ //控制交换的前者
20 for(j=i+1;j<n;j++){ //控制交换的后者
21 if(0 > strcmp(str[j],str[i])){
22 strcpy(temp,str[i]);
23 strcpy(str[i],str[j]);
24 strcpy(str[j],temp);
25 }
26 }
27 }
28 for(i=0;i<n;i++){
29 printf("%s ",str[i]);
30 }
31 printf("\n");
32 return 0;
33 }
root@ubuntu:/C/three_text# ./a.out
Spain China Italy Germany French
China French Germany Italy Spain
4.放入一个带空格的字符串,输出删除空格的字符串
#include <stdio.h>
#include <string.h>
#define N 100
void del(char *str)
{
char *p=str;
char *q=NULL;
while(*p)
{
if(*p != ' ')
p++;
else
{
q=p;
while(*q)
{
*q=*(q+1);
q++;
}
}
}
puts(str);
}
int main(int argc, char *argv[])
{
char str[N]={0};
puts("请放入一个字符串str:");
gets(str);
del(str);
return 0;
}
root@ubuntu:/C/three_text# ./a.out
请放入一个字符串str:
sd ad
sdad
5.输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。编写转换函数chnum。
输入一个整数字符串转换为一个整数值.
如”1234”转换为1234,”-1234”转换为-1234。编写转换函数chnum。
================================================*/
#include <stdio.h>
#include <string.h>
#define N 100
char chnum(char *str)
{
int i=0;
char *p;
p = str;
while(*p != '\0')
{
if(*p>'0' && *p<'9')
i = i*10 + *p - 48;
p++;
}
return str;
}
int main(int argc, char *argv[])
{
int m,n,i;
char str[N]={0};
puts("please input int-str:");
gets(str);
if(str[0] == '-')
{
m = -chnum(str+1);
}
else
{
chnum(str);
}
puts("输入的数字字符串转变为数字串:");
puts(str);
return 0;
}
root@ubuntu:/C# ./a.out
please input int-str:
1234
输入的数字字符串转变为数字串:
1234
root@ubuntu:/C# ./a.out
please input int-str:
-1234
输入的数字字符串转变为数字串:
-1234
6.请编写一个函数func, 用来删除字符串中的所有空格。
例如, 输入asd af aa z67, 则输出为 asdafaaz67。
6 请编写一个函数func, 用来删除字符串中的所有空格。
7 例如, 输入asd af aa z67, 则输出为 asdafaaz67。
8 ================================================*/
9 #include <stdio.h>
10 #include <string.h>
11 #define N 100
12 void func(char *p)
13 {
14 int j=0;
15 for(int i=0;p[i] != '\0';i++)
16 {
17 if(i==0 && p[i] != ' ')
18 p[j++] = &p[i];
19 else if(p[i] != ' ' && p[i-1] == ' ')
20 {
21 p[j++] = &p[i];
22 }
23 }
24 for(int i=0;p[i] != '\0';i++)
25 {
26 if(p[i] == ' ')
27 p[i] = NULL;
28 }
29 for(int i=0;i<6;i++)
30 puts(p[i]);
31 }
32 int main(int argc,char *argv[])
33 {
34 char str[60]= {0};
35 char *p;
36 p = str;
37 puts("please input a str:");
38 gets(str);
39 func(p);
40 return 0;
41 }
7.下面程序的功能是将从键盘输入的偶数写成两个素数
1 /*=============================================== 2 * 文件名称:t.c 3 * 创 建 者: 4 * 创建日期:2022年06月28日 5 * 描 述:编译带 -lm 6 * 从键盘输入的偶数写成两个素数的和 7 ================================================*/ 8 #include <stdio.h> 9 #include <math.h> 10 int main(int argc, char *argv[]) 11 { 12 int a,b,c,d; 13 scanf("%d",&a); 14 for(b=3;b<=a/2;b+=2){ 15 for(c=2;c<=sqrt(b);c++) //寻找第一个素数 16 if(b%c==0) //寻找的不是素数,例如偶数为22,这是b为9 17 break; 18 if(c>sqrt(b)) //d是以一个素数 19 d=a-b; 20 else 21 continue; 22 for(c=2;c<=sqrt(d);c++) //与上面同理 23 if(d%c==0) 24 break; 25 if(c>sqrt(d)) 26 printf("%d=%d+%d\n",a,b,d); 27 } 28 printf("\n"); 29 return 0; 30 }
8.字符串转换成字符数组
#include <stdio.h> #include <string.h> //字符转16进制 static int charToHex(char lchar, char hchar, char *Hex) { char str[2] = {0}, tmp[2] = {0}, hex[1] = {0}; str[0] = lchar; str[1] = hchar; for(int i = 0; i < 2; ++i) { if(str[i] >= '0' && str[i] <= '9') tmp[i] = str[i] - '0'; else if (str[i] >= 'A' && str[i] <= 'F') tmp[i] = str[i] - 'A' + 0x0A; else if (str[i] >= 'a' && str[i] <= 'f') tmp[i] = str[i] - 'a' + 0x0a; else { //debug perror("hcarToHex"); return -1; } } hex[0] = (tmp[0] << 4) + tmp[1]; memcpy(Hex, hex, sizeof(char)); return 0; } //字符串转16进制字节数组 //extern "C" int strToHex(const char *str, int slen, char *bytebuf, int *bytebuflen) { if((slen % 2) == 1 || slen == 0) { //需要转的字符串不是偶数或者为0 perror("strtohex_1"); return-1; } for(int i = 0; i < (slen / 2); ++i) { printf("%d.=======\n",i); if(charToHex(str[2 * i], str[2 * i + 1], &bytebuf[i]) < 0) { //debug perror("strtohex_2"); //return -1; } } *bytebuflen = (slen / 2); #if 0 printf("转换后的字符数组:\n"); printf("{"); for(int i = 0; i < *bytebuflen; ++i) { printf("%02x%s", bytebuf[i], i<(*bytebuflen)-1?":" : " "); } printf("}\n"); #endif return 0; } int main(void) { const char buf[] = "1A2b"; char byte[32] = {0}; int bytelen = sizeof(byte); strToHex(buf, strlen(buf), byte, &bytelen); //strToHex(buf, strlen(buf), byte, (int *)sizeof(byte)); //操作地址 int len = sizeof(buf) / 2; printf("转换后的字符数组:\n"); printf("{"); for(int i = 0; i < len; ++i) { printf("%x%s", byte[i], i<(len)-1?":" : " "); } printf("}\n"); return 0; (void)len; }