c语言错误笔记(编程版)(持续更新中...)

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 }

版权声明:本文为hold_the_key原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。