c语言字符数组一些启示

来源:互联网 发布:电脑连接网络出现红叉 编辑:程序博客网 时间:2024/05/19 02:03

    最近博主在学习《linux系统编程》,所以想记下来学习的一些心得,与大家分享,也备以后回顾只用。

    第一天,就从我在今天学习过程遇到的问题写起,博主今天在学习标准IO库,遇到一个问题,关于字符指针的问题,代码如下:

   

  1 #include<stdio.h>  2 #include<stdlib.h>  3   4 int main()  5 {  6     FILE *stream;  7     char *s;  8     int c;  9     int n=6; 10     stream=fopen("./test.txt","r"); 11     while(--n>0 && (c=fgetc(stream))!=EOF) 12     { 13         *s++=c; 14     } 15     *s='\0'; 16     printf("s=%s\n",s); 17     exit(0); 18 }~ 
    本程序很简单,就是以标准流的形式打开一个文件,然后从文件读取n-1个字符,但是运行这个程序的时候,会出现段错误,百度之后,得知,是因为使用了未申请的内存或者申请的内存有错误,那么问题出现在哪了?

    通过查资料得知问题出现在char *s 和*s++=c。因为在程序中,字符指针没有初始化,即没有给该指针赋值(s不知道指向何处),那么如果给该指针赋值,那么值不知存哪去,而s++也没有意义。

    所以应该先给s赋值一个地址字符数组的地址,然后在往这个地址赋值,加1赋值等等。所以改进代码如下

  1 #include<stdio.h>  2 #include<stdlib.h>  3   4 int main()  5 {  6     FILE *stream;  7     char *s;  8     char str[1024];  9     s=str; 10     int c; 11     int n=6; 12     stream=fopen("./test.txt","r"); 13     while(--n>0 && (c=fgetc(stream))!=EOF) 14     {    15         *s++=c; 16     } 17     *s='\0'; 18     printf("s=%s\n",str); 19     exit(0); 20 }
    运行结果如下图所示

  

   由于较少使用c语言,所以一些基本的知识点都忘了,所以我也感受到了,学习语言一定要多写,看着都懂,但是当自己写的时候,就会碰到各种细节问题。平时看起来很简单的问题,当自己亲身躬为的时候,有时候并不是那么简单

    可能我写很基础或不是完全正确,希望大神可以指点指点。

0 0
原创粉丝点击