C语言通过指针数组和二维数组读取文件

本文介绍了一个使用C语言进行文件读写及指针操作的示例程序,包括如何利用指针数组进行字符串排序,并展示了如何通过指针动态分配和释放内存。
 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 # include <time.h>
 4 # include <string.h>
 5 int main ()
 6 {
 7     int _rand (int x);
 8     int z,m;
 9     char p;
10 
11     char *q[100]={0};
12     
13     int a[100];
14     FILE *fp = fopen ("name.txt","a+");
15     if (fp == NULL)
16     {
17         printf ("文件打开失败");
18         exit(1);
19     }
20     p = getc (fp);
21     if (p == EOF)
22     {
23         fseek (fp,0l,SEEK_SET);
24         z = 0;
25         printf ("文件中没有数据,或者数据没有按照规定格式输入!\n请输入:");
26         printf ("输入格式为n,姓名(ps:ctrl+z结束输入)\n");
27         while (scanf ("%d %s",&a[z],*q+z) != EOF)
28         {
29             fprintf (fp,"%d %s\n",a[z],*q+z);
30             z++;
31         }
32     }
33     else
34     {
35         fseek (fp,0l,SEEK_SET);
36         z = 0;
37         q[z]=(char *)malloc(100); 
38         while (EOF != fscanf (fp,"%d %s",&a[z],q[z]))
39         {
40             
41             printf ("%d %s\n",a[z],q[z]);
42             z++;
43             q[z]=(char *)malloc(100); 
44         }
45     }
46     for (m = 0;m < z;m++)
47     {
48         printf ("%d %s\n",a[m],q[m]);
49     }
50     for (m = 0;m < z;m++)
51     {
52         free(q[m]);
53     }
54     
55     m = _rand (z);
56     //printf ("%d %s",a[m],q+m);
57 }
58 int _rand (int x)
59 {
60     int a = 0;
61     srand (time(NULL));
62     srand (rand());
63     a = (rand()%x);
64     printf ("%d              ",a);
65     return a;
66 }
name.txt
1 不是你
2 还是你
3 到底是不是你
 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 # include <time.h>
 4 # include <string.h>
 5 int main ()
 6 {
 7     int _rand (int x);
 8     int z,m;
 9     char p;
10 
11     char q[20][100];
12     int a[100];
13     FILE *fp = fopen ("name.txt","a+");
14     if (fp == NULL)
15     {
16         printf ("文件打开失败");
17         exit(1);
18     }
19     p = getc (fp);
20     if (p == EOF)
21     {
22         fseek (fp,0l,SEEK_SET);
23         z = 0;
24         printf ("文件中没有数据,或者数据没有按照规定格式输入!\n请输入:");
25         printf ("输入格式为n,姓名(ps:ctrl+z结束输入)\n");
26         while (scanf ("%d %s",&a[z],q+z) != EOF)
27         {
28             fprintf (fp,"%d %s\n",a[z],q+z);
29             z++;
30         }
31     }
32     else
33     {
34         fseek (fp,0l,SEEK_SET);
35         z = 0;
36         while(!feof(fp))
37         {
38             fscanf (fp,"%d %s",&a[z],q+z);
39             z++;
40         }
41         /*while (EOF != fscanf (fp,"%d %s",&a[z],q+z))
42         {
43             printf ("%d %s\n",a[z],q+z);
44             z++;
45         }*/
46     }
47     for (m = 0;m < z;m++)
48     {
49         printf ("%d %s\n",a[m],q+m);
50     }
51     m = _rand (z);
52     //printf ("%d %s",a[m],q+m);
53 }
54 int _rand (int x)
55 {
56     int a = 0;
57     srand (time(NULL));
58     srand (rand());
59     a = (rand()%x);
60     printf ("%d              ",a);
61     return a;
62 }
name.txt
1 不是你
2 还是你
3 到底是不是你
指针地址都是由操作系统分配的,不可以自己随意制定。
先用malloc函数分配一个足够大的内存空间,然后用scanf函数输入内容,不用这些空间后最好用free函数释放。部分代码
#include <stdlib.h> /* 使用malloc和free函数需要这个头文件 */
char *a[3];
a[0]=(char *)malloc(100); /* 算上结尾的\0,不超过100个字符 */
scanf("%s", a[0]);
free(a[0]); /* 使用解释后释放 */
C语言教材讲指针的部分有讲解。
*****************************
利用指针数组对字符串排序的程序如下:
void SortString(int n, char *str[])
{
char *c;
int i,j;
for(i=0;i<=n-2;i++)
for(j=0;j<=n-2-i;j++)
{
if(strcmp(str[j],str[j+1])>0)
{c=str[j];str[j]=str[j+1];str[j+1]=c;}
}
}
main()
{
int i;
char *lang[]={"China","France","English"};
SortString(3,lang);
for(i=0;i<3;i++)
printf("\n%s ", lang[i]);
}
程序运行的结果为:
China
English
France

排 序前后指针数组的内存示意图如下。排序前lang[0],lang[1]和lang[2]保存的地址分别为"China","France" 和 "English"的首地址。排序结束后,3个字符串的内存情况没有发生变化,但指针数组里保存的指针顺序发生了变化:lang[1]指向 了"English",lang[2]指向了" France "。

 

转载于:https://www.cnblogs.com/zhangyongjian/p/3657783.html

以下是用二维数组指针数组实现日历的C语言代码: ``` #include <stdio.h> int main() { int year, month, days, i, j, k; int calendar[6][7]; // 二维数组 int *p[6]; // 指针数组 printf("请输入年份月份(例如:2022 11):"); scanf("%d %d", &year, &month); // 计算该月有多少天 if (month == 2) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { days = 29; } else { days = 28; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { days = 30; } else { days = 31; } // 计算该月的第一天是星期几 int weekday = 0; for (i = 1900; i < year; i++) { if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) { weekday += 366 % 7; } else { weekday += 365 % 7; } } for (i = 1; i < month; i++) { if (i == 2) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { weekday += 29 % 7; } else { weekday += 28 % 7; } } else if (i == 4 || i == 6 || i == 9 || i == 11) { weekday += 30 % 7; } else { weekday += 31 % 7; } } weekday = (weekday + 1) % 7; // 初始化二维数组指针数组 for (i = 0; i < 6; i++) { p[i] = calendar[i]; // 指针数组指向二维数组的每一行 for (j = 0; j < 7; j++) { calendar[i][j] = 0; } } // 填充日期 k = 1; for (i = 0; i < 6; i++) { if (i == 0) { for (j = weekday; j < 7; j++) { calendar[i][j] = k++; } } else { for (j = 0; j < 7 && k <= days; j++) { calendar[i][j] = k++; } } } // 打印日历 printf(" %d年%d月\n", year, month); printf("日 一 二 三 四 五 六\n"); for (i = 0; i < 6; i++) { for (j = 0; j < 7; j++) { if (calendar[i][j] == 0) { printf(" "); } else { printf("%2d ", calendar[i][j]); } } printf("\n"); } return 0; } ``` 该程序首先读取年份月份,然后计算该月有多少天该月的第一天是星期几。接着使用二维数组指针数组来存储操作日历数据,最后打印出日历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值