实验六

 

程序task1_1.c中,假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地
址值是多少?
程序task1_2.c中,假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地
址值是多少?
都是对指针变量做++p操作,为什么结果不同?

一个是字符数组一个是整形数组,字符数组单个元素占一个字节,整形数组单个元素占四个字节

#include <stdio.h>
#define N 4

int main()
{
    int x[N] = {1, 9, 8, 4};
    int i;
    int *p;
    
    // 方式1:通过数组名和下标遍历输出数组元素
    for(i=0; i<N; ++i)
        printf("%d", x[i]);
    printf("\n");
    
    // 方式2:通过指针变量遍历输出数组元素 (写法1) 
    for(p=x; p<x+N; ++p)
        printf("%d", *p);
    printf("\n"); 
    
    // 方式2:通过指针变量遍历输出数组元素(写法2) 
    p = x;
    for(i=0; i<N; ++i)
        printf("%d", *(p+i));
    printf("\n");

    // 方式2:通过指针变量遍历输出数组元素(写法3) 
    p = x;
    for(i=0; i<N; ++i)
        printf("%d", p[i]);
    printf("\n");
        getchar();
    return 0;
}

 

 

 

#include <stdio.h>
#define N 4

int main()
{
    char x[N] = {'1', '9', '8', '4'};
    int i;
    char *p;
    
    // 方式1:通过数组名和下标遍历输出数组元素
    for(i=0; i<N; ++i)
        printf("%c", x[i]);
    printf("\n");
    
    // 方式2:通过指针变量遍历输出数组元素 (写法1) 
    for(p=x; p<x+N; ++p)
        printf("%c", *p);
    printf("\n"); 
    
    // 方式2:通过指针变量遍历输出数组元素(写法2) 
    p = x;
    for(i=0; i<N; ++i)
        printf("%c", *(p+i));
    printf("\n");

    // 方式2:通过指针变量遍历输出数组元素(写法3) 
    p = x;
    for(i=0; i<N; ++i)
        printf("%c", p[i]);
    printf("\n");
        getchar();
    return 0;
}

 

 

 

程序task2_1.c中:
假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值是多少?
假设指针变量q初始值是地址2000,则执行++q后,指针变量q中存放的地址值是多少?

2004

2016
程序task1_2.c中:
假设指针变量p初始值是地址2000,则执行++p后,指针变量p中存放的地址值是多少?
假设指针变量q初始值是地址2000,则执行++q后,指针变量q中存放的地址值是多少?

2001

2004
都是对指针变量做++操作,为什么结果有差别?

一个是行指针,一个是指针

#include <stdio.h>

int main()
{
int x[2][4] = { {1,9,8,4}, {2,0,2,2}} ;
int i, j;
int *p; // 指针变量,存放int类型数据的地址
int (*q)[4]; // 指针变量,指向包含4个int型元素的一维数组

// 使用数组名、下标访问二维数组元素
for(i=0; i<2; ++i)
{
for(j=0; j<4; ++j)
printf("%d", x[i][j]);
printf("\n");
}

// 使用指针变量p间接访问二维数组元素
for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
{
printf("%d", *p);
if( (i+1)%4 == 0)
printf("\n");
}

// 使用指针变量q间接访问二维数组元素
for(q=x; q<x+2; ++q)
{
for(j=0; j<4; ++j)
printf("%d", *(*q+j));
printf("\n");
}

return 0;
}

 

 

 

#include <stdio.h>

int main()
{
	char x[2][4] = { {'1', '9', '8', '4'}, {'2', '0', '2', '2'} };
	int i, j;
	char *p;    	// 指针变量,存放char类型数据的地址 
	char (*q)[4];	// 指针变量,指向包含4个char型元素的一维数组 
	
	// 使用数组名、下标访问二维数组元素
	for(i=0; i<2; ++i)
	{
		for(j=0; j<4; ++j)
			printf("%c", x[i][j]);
		printf("\n");
	 } 
	
	// 使用指针变量p间接访问二维数组元素
	for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
	{
		printf("%c", *p);
		if( (i+1)%4 == 0)
			printf("\n");
	}
	
	// 使用指针变量q间接访问二维数组元素 
	for(q=x; q<x+2; ++q)
	{
		for(j=0; j<4; ++j)
			printf("%c", *(*q+j));
		printf("\n");
	}
	
	return 0;
}

  

 

 

 

问题1:数组s1的大小是多少?sizeof(s1)计算的是什么?strlen(s1)统计的是什么?
问题2:line7代码,能否替换成以下写法?

1.12,该数组所占字节数,字符数组长度

2.不能

问题3:line20-22执行后,字符数组s1和s2中的内容是否交换?

3.是

#include <stdio.h>
#include <string.h>
#define N 80

int main()
{
    char *s1 = "C, I love u.";
    char *s2 = "C, I hate u.";
    char *tmp;
    
    printf("sizeof(s1) vs. strlen(s1): \n");
    printf("sizeof(s1) = %d\n", sizeof(s1));
    printf("strlen(s1) = %d\n", strlen(s1));
    
    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    
    printf("\nswapping...\n");
    tmp = s1;
    s1 = s2;
    s2 = tmp;
    
    printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    
    return 0;
}

 

 

 

问题1:指针变量s1中存放的是什么?sizeof(s1)计算的是什么?strlen(s1)统计的是什么?
问题2:line7代码能否替换成下面的写法?

1.字符串s1的地址,sizeof是计算该数组所占字节数,strlen统计数组元素个数。

#include <stdio.h>
#include <string.h>
#define N 80

int main()
{
char s1[] = "C, I love u.";
char s2[] = "C, I hate u.";
char tmp[N];

printf("sizeof(s1) vs. strlen(s1): \n");
printf("sizeof(s1) = %d\n", sizeof(s1));
printf("strlen(s1) = %d\n", strlen(s1));

printf("\nbefore swap: \n");
printf("s1: %s\n", s1);
printf("s2: %s\n", s2);

printf("\nswapping...\n");
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);

printf("\nafter swap: \n");
printf("s1: %s\n", s1);
printf("s2: %s\n", s2);
getchar();
return 0;
}

 

 

 

 

 

问题3:line20-line22,交换的是什么?字符串常量"C, I love u."和字符串常量"C, I hate
u."在内存存储单元中有没有交换?

3.地址。没有

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#define N 5

int check_id(char* str);   // 函数声明 

int main()
{
     char * pid[N] = { "31010120000721656X",
                     "330106199609203301",
                     "53010220051126571",
                     "510104199211197977",
                     "53010220051126133Y" };
    int i;

    for (i = 0; i < N; ++i)
        if (check_id(pid[i]))  // 函数调用 
            printf("%s\tTrue\n", pid[i]);
        else
            printf("%s\tFalse\n", pid[i]);

    return 0;
}

// 函数定义
// 功能: 检查指针str指向的身份证号码串形式上是否合法。
// 形式合法,返回1,否则,返回0 
int check_id(char* str)
{
    int i,n=strlen(str);
    if (n!=18)return 0;
    for ( i = 0; i < n; i++)
    {
        if(*str!='X'&&(*str>57 ||*str<48))return 0;
    }
    return 1;
    
}

 

 

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>

#define N 80
int is_palindrome(char* s);      // 函数声明 

int main()
{
    char str[N];
    int flag;

    printf("Enter a string:\n");
    while (gets_s(str)) {

        flag = is_palindrome(str);   // 函数调用 

        if (flag)
            printf("YES\n");
        else
            printf("NO\n");
        printf("Enter a string:\n");
    }

    return 0;
}

// 函数定义
// 功能:判断s指向的字符串是否是回文串
// 如果是,返回1;否则,返回0 
int is_palindrome(char* s)
{
    int n = strlen(s),i,k=0;
    char* j = s + n-1;
   
    while (*s== *j && j>s)s++,j--,k += 1;
 
    return k==n/2?1:0;
}

  

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 80
void encoder(char* s); // 函数声明
void decoder(char* s); // 函数声明

int main()
{
char words[N];
printf("输入英文文本: ");
while (gets_s(words)) {


printf("编码后的英文文本: ");
encoder(words); // 函数调用
printf("%s\n", words);

printf("对编码后的英文文本解码: ");
decoder(words); // 函数调用
printf("%s\n", words);

printf("输入英文文本: ");
}

return 0;
}


/*函数定义
功能:对s指向的字符串进行编码处理
编码规则:
对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换
其它非字母字符,保持不变
*/
void encoder(char* s)
{

for (; *s; s++)
{
if (*s >= 65 && *s <= 90 || *s >= 97 && *s <= 122) {
if (*s == 'z' || *s == 'Z')*s -= 25;
else *s += 1;
}
}
}


/*函数定义
功能:对s指向的字符串进行解码处理
解码规则:
对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换
其它非字母字符,保持不变
*/
void decoder(char* s)
{
for (; *s; s++)
{
if (*s >= 65 && *s <= 90 || *s >= 97 && *s <= 122) {
if (*s == 'a' || *s == 'A')*s += 25;
else *s -= 1;
}
}
}

 

posted @ 2022-06-06 22:44  picapicac  阅读(50)  评论(5)    收藏  举报