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

目录

1.sizeof()和strlen()的区别:sizeof():以字节为单位返回其整个长度的大小(总),在编译阶段便开始起作用适用于绝大多数类型;

2.存储溢出

3.输入5个国家的英文名称,按字母排序输出   Eg: 输入:Spain China Italy Germany French输出: China French Germany Italy Spain

 4.放入一个带空格的字符串,输出删除空格的字符串

5.输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。编写转换函数chnum。

6.请编写一个函数func,  用来删除字符串中的所有空格。 例如,  输入asd  af  aa  z67,  则输出为  asdafaaz67。

7.下面程序的功能是将从键盘输入的偶数写成两个素数

8.字符串转换成字符数组


 

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值