【C++】一些基础算法和注意的点【一】

目录

1.冒泡排序

2.memset()函数的用法:对数组填充0,-1

3.a[i]=getchar(),putchar(a[i])

4.关于gets,puts,printf,puts


1.冒泡排序

#include <cstdio>
int main()
{
    int a[5]={8,4,3,9,1};
    for(int i=0;i<5;i++)
    {
        printf("%4d",a[i]);
    }
    for(int i=1;i<5;i++)//从1开始方便,内层循环实现每次最后一个是有序的思想。
    {
        for(int j=0;j<5-i;j++)
        {
            if(a[j]>a[j+1]){
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    printf("%c\n",7);//响铃一下
    for(int i=0;i<5;i++)
    {
        printf("%4d",a[i]);
    }
    return 0;
}

2.memset()函数的用法:对数组填充0,-1

#include <cstdio>
#include <string.h>
int main()
{
    int a[5];
    int b[5];
    memset(a,1,sizeof(a));//memset是按字节赋值
    memset(b,-1,sizeof(b));
    for(int i=0;i<5;i++)
    {
        printf("%9d",a[i]);
    }
    printf("\n");
     for(int i=0;i<5;i++)
    {
        printf("%3d",b[i]);
    }
    return 0;
}

运行结果:

原因:memset对每个字节进行赋值,int是四个字节:00000001000000010000000100000001 (1转换成二进制是00000001)

 3.a[i]=getchar(),putchar(a[i])

#include <cstdio>
#include <string.h>
int main()
{
    char a[5];
    for(int i=0;i<5;i++)
    {
        a[i]=getchar();
        getchar();//接收上一个输入的结束标志 空格或者换行,不加也可以是单个字符
    }
    printf("\n");
    for(int i=0;i<5;i++)
    {
       putchar(a[i]);
    }
    printf("\n");
    for(int i=0;i<5;i++)
    {
       printf("%c",a[i]);
    }
    return 0;
}

运行结果:

4.关于gets,puts,printf,puts

这里看了很久资料,结果应该和编译器有关:

同样的代码如下:

#include <cstdio>
int main()
{
   char str[10];
   for(int i=0;i<3;i++)
   {
       str[i]=getchar();
   }
   puts(str);
   str[4]='\0';
   puts(str);
    return 0;
}

 codeblocks输出:

VC++2010输出:

 从VC的输出可以观察到:

puts输出是以'\0'为结束,将‘\0’转换为回车进行输出(VC怎么看,是这样吗)。

此外在codeblocks里面对gets和puts的使用很奇怪:

同样的代码:

#include <cstdio>
int main()
{
    char str1[3];
    for(int i=0; i<3; i++)
    {
        str1[i]=getchar();
    }
    puts(str1);
    printf("\n");
    getchar();
    char str2[3];
    gets(str2);
    puts(str2);
    return 0;
}

 codeblocks:运行没问题看起来:

 在VC中:

 额,但是VC中的意思是和资料上一样的,的确应该加一个\0,而且输入的也不对,超出了。

改了一下代码:

#include <cstdio>
int main()
{
    char str1[3];
    for(int i=0; i<3; i++)
    {
        str1[i]=getchar();
    }
    puts(str1);
    printf("\n");
   // getchar();
    char str2[3];
    gets(str2);
    puts(str2);
    return 0;
}

输入也变了一下,在VC中:

 可以看大getchar将我输入的空格读进去了,又因为我没有自己写结束符加进去(不是%s格式输入也不是gets读入),所以是puts是乱码。下面第二个我只输入两个然后回车就是好好的了,gets函数接收一行数据,遇到回车结束,将回车符'\n'转换成了'\0'保存在了数组中,所以不用自己加结束符就可以puts无错了。如果看一下溢出的情况,我如果输了三个字母应该会报错吧:

果然!

额,好吧,我放弃用codeblocks了,还是老老实实用VC吧!

发布了68 篇原创文章 · 获赞 20 · 访问量 6885

猜你喜欢

转载自blog.csdn.net/qq_43633973/article/details/102621221