[笔记]VS2017 char *p=“”不可用的解决办法

起因:

今天在做c语言的功课时,发现旧的教材(基于vc++6.0)使用了如下的代码,对字符串指针进行赋值.

char *p="Hello World";

但是编写到VS2017上时报了下面的一个错误.

直接导致编译失败,经过了baidu的查找后,知晓了具体原因.

解决办法:

应把源代码修改成如下的代码.

//原代码
char *p="Hello world";
//修改后的代码
const char *p="Hello world";

主要原因是因为在新版本中增强了对字符串指针的安全性,通过使用静态声明,来防止越界

[笔记][Laravel]数据库操作

准备

新建App\Http\Controller\StudentController.php

<?php
namespace App\Http\Controller;
use Illuminate\Support\Facades\DB;//使用DB类

class StudentController extends Controller{
//创建名为StudentController的控制器并继承Controller基类
public function query(){
//php
}
}

切换至routes\web.php新建一个路由

Route::any('query','StudentController@query');

创建


连接数据库

配置.env文件

DB_CONNECTION=mysql[数据库的连接模式]
DB_HOST=数据库的IP地址
DB_PORT=数据库端口
DB_DATABASE=数据库库名
DB_USERNAME=数据库用户名
DB_PASSWORD=数据库密码

配置config/database.php

'mysql' => [
'driver' => 'mysql', //数据库的类型
'host' => env('DB_HOST', 'localhost'), //数据库的位置
'port' => env('DB_PORT', '3306'), //端口号
'database' => env('DB_DATABASE', ''), //数据库名
'username' => env('DB_USERNAME', ''), //用户名
'password' => env('DB_PASSWORD', ''), //密码
'charset' => 'utf8', //字符集
'collation' => 'utf8_unicode_ci', //排序方式
'prefix' => '', //前缀
'strict' => true, //Strict模式
'engine' => null, //引擎
],

至此laravel即可连接上数据库了


使用DB facades完成数据库操作

SQL语句中的?是占位符,可以通过第二变量传入数组来传递数值

查询数据

DB::select("select * from student");//可以直接使用select语句
DB::select("select * from student where age = ? and name = ?",[18,'7gugu'])//等同于:select * from student where age = 18 and name = '7gugu'

插入数据

DB::insert("insert into student(name,age,sex) values('hzq','19','0')");//可以直接使用insert语句
DB::insert("insert into student(name,age,sex) values(?,?,?)",['hzq','19','0']);//等同于:insert into student(name,age,sex) values('hzq','19','0'),这样子方便传值

更新数据

DB::update("update student set age = 1 where name =7gugu");//可以直接使用update语句
DB::update("update student set age = ? where name =?",[1,'7gugu'])//等同于:update student set age = 1 where name ='7gugu'

删除数据

DB::delete('delete from student where id=1002');//直接使用delete语句
DB::delete('delete from student where id=?',['1002']);//等同于:delete from student where id=1002

使用查询构造器

数据表指向器

DB::table("数据表名")->操作/筛选器;
DB::table('student')->操作/筛选器;

筛选器

DB::table('student')->where()->操作;
where('id',1001)//即可筛选id是1001的数据
where('id','=',1001)//即可筛选id是1001的数据
where('id = ? and name = ?',[1001,'7gugu'])//即可限定多个条件

排序

/*
* @param string 字段名称
* @param string 排序方式(ASC:正序|DESC:倒序)
*/
DB::table('student')->orderBy('字段名','asc|desc')->操作;

字段值自增

/*
* 数值自增
* @param string 字段名称
* @param int 单次自增数量
*/
DB::table('student')->where('id','1001')->increment('age',1);

字段值自减

/*
* 数值自减
* @param string 字段名称
* @param int 单次自减数量
*/
DB::table('student')->where('id','1001')->decrement('age',1);

插入数据

DB::table('student')->insert(['name'=>'7gugu','age'=>'18']);//插入一条数据
DB::table('student')->insert([
['name'=>'test','age'=>'20'],
['name'=>'guangzhou','age'=>'30']
]);//使用一个数组来承载多条数据,即可插入多条数据

更新数据

DB::table('student')->where('id',1004)->update(['age'=>30]);//使用update函数即可更新指定字段的值
//laravel好像并不可以一次性更新多个字段

删除数据

DB::table('student')->where('id','1002')->delete();

get函数

/*
*用于获取限定条件后的数据,可以无限定条件直接获取
*/
DB::table('student')->get();

first函数

/*
* 用于获取符合限定条件的第一行的数据
* 无需传参
*/
DB::table('student')->first();

pluck函数

/*
* 获取指定名称的字段数据
*/
DB::table('student')->pluck('name','age');

效果如图所示:

聚合函数

//count()统计表的数据总数
DB::table('student')->count();
//max()比较某个字段的最大值
DB::table('student')->max('age');
//min()比较某个字段的最小值
DB::table('student')->min('age');
//avg()计算某个字段的平均值
DB::table('student')->avg('age');
//sum()计算某一个字段的所有数值
DB::table('student')->avg('age');

truncate函数

清空表中数据[危险]

//truncate()清空表中数据[危险]
DB::table('student')->truncate();

chunk函数

用于分块查找数据(用于大量数据查找时使用)

DB::table('users')->chunk(2, function($users)
{
dd($users);//每次运行仅仅查询两条数据,直至查询完毕
});

结果如图所示:

[笔记][C语言]指针学习小结[20181206]

C语言学习小结:

指针的初始化

指针变量可以初始化为0,NULL或一个地址[16进制]
0和NULL等价,相当于一个空地址

//使用(变量类型 *变量名)这样一个组合就可以声明一个指定类型的指针变量
int *a;
  • 指针变量就是用来存储变量地址的一种变量
  • 指针的存储的地址指的是该变量的起始位置

指针运算符

  • *指针运算符,用于把指针指向变量,可用于获取变量的值
  • &取址运算符,用于获取变量的地址
  • *(&a)和&(*a)的效果相同,都是获取变量的地址,只是处理的次序不同

例子:

#include &lt;iostream&gt;
int main(){
int *a,i=100;
printf("a的位置%p,i的值:%d\n",a,i);
a=&amp;i;
printf("a的位置%p,a的值是%d\n",&amp;a,*a);
}

运行结果:


为什么要指定指针变量的类型?

指针变量不仅仅是要存储变量的地址,同时也要记录变量的空间大小。
因为C语言传递变量时需要把数据传入已确定的内存地址及其所占的空间,
所以一个char类型的指针不可以直接指向一个int型的变量,如果强制操作将会导致越界的bug。


指针偏移:

#include &lt;iostream&gt;
void main() {
	int *a[3];//初始化整型指针
	int b[3] = { 1,2,3 };
	a[0] = &amp;b[0];//将b[0]的地址赋值给a[0]存储
	a[1] = &amp;b[1];
	a[2] = &amp;b[2];
	printf("a的原来指向的值%d\n", **a);//*a仅仅是获取到b的地址,**a才是获取到b的值
	printf("a的变化后指向的值%d\n", **(a+1));//a+1指的是a[1]然后再重复上一行的操作
}

指针指向多维数组

#include &lt;iostream&gt;
void main(){
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *b[3];
b[0]=a[0];//在多维数组中,b[0]=a[0]会自动指向a[0]的地址,不用像一维数组,使用取址符指向a[0]
b[1]=a[1];
b[2]=a[2];
printf("a[1][2]的值%d\n",*(*(b+1)+2));//现将b指向b[1],然后将b[1]指向b[1][2]
}

为啥指针指向一维数组时,需要使用取址符,但是指向多维数组时的第一维时不用取址符?

因为指针指向一维数组时,b[0]代表的是一个值,而不是一个地址,所以需要使用取址符来获取这个值得地址,
但是当指针指向二维数组时,b[0]的身份是一个地址,所以就不用使用取址符就可以直接获取到地址了。


One More Thing

数组p[i]是c语言中的一种语法糖
即使函数被设计成void fun(int array[5], int n),array依然被看成是指针。也就是说即使数组带了长度,该长度也会被编译器忽略掉。(即:a[i]=>*(a+i))
一句话:形参中的数组统统看成指针。
既然如此,还不如直接写成void fun(int *array, int n)。指针的形式,更能表达本意。

array和&array都是指针,但类型不同。array的类型是int*,而&array的类型是int(*)[2]。array是指向普通int类型的指针;&array是数组指针,该数组元素是int类型的,且数组大小是2。

[笔记][laravel]模型Model的使用v1.0

怎么新建Model:

在App文件夹内新建.php文件即可。(命名方式:首字母大写,如Member.php),如图所示:

怎么使用Model:

如以下代码:

namespace App\Http\Controllers;

use App\Member;//使用App/Member这个命名空间

class MemberController extends Controller{
    public function info(){
        return Member::getMember();
    }
}

即可调用Member这个model,并调用model下的getMember这个函数

[笔记][laravel]视图的使用v1.0

怎样新建视图:

在resource/views下新建php文件即可。

模板文件类型:

  • .php文件
  • .blade.php文件

二者皆可在稍后的使用中被输出,但为了遵循项目开发的统一性,统一使用视图名字.blade.php(命名规则遵循驼峰式命名,如:ViewName)。

在该文件夹(views)下,也可以新建文件夹,并将视图文件放入其中进行归类。


怎样输出视图:

打开位于App/Http/Controller/下的控制器文件。

MemberCotroller.php

class MemberController extends Controller {
return view('info');
}

使用view()函数即可输出视图,使用函数后,view函数将会自动搜索该名字的(.php|.blade.php)文件

return view('member/info');

如果模板文件被放进了文件夹中,就给路径添加文件夹路径即可

如何给视图传入参数:

在view的第二参数中即可传入参数,第二参数是array
MemberController.php

return view('info',['name'=>'7gugu','age'=>'18']);

info.blade.php

<h1>Hello World</h1>
<p>Name:{{$name}}</p>
<p>Age:{{$age}}</p>

视图模板中使用{{$变量名}}接收来自Controller的变量

[笔记][C语言]解决VS 2017下“*”乘法符号变成指针标识符的解决方法

问题描述:

今天在Coding的时候,编写到了如下的一段代码

#include <stdio.h>
#define PI 3.14
int CircleRing(int r){
  return PI*r*r;
}

然后VS的语法检测器就抽风了,硬是把PI*r这个线性运算的公式,误认成PI和指针变量r了。在通过上网查阅资料后,暂无比较官方的解决办法后,发现了可以暂时解决这个问题的写法。


解决办法:

int CircleRing(int r){
  return r*r*PI;
}

即可完美解决误认的错误,继续编译操作。

小结:

目前已知该bug仅仅是会出现在VS 2017上。在Devc++上,按照原写法是可以正常编译并且运行的。目测可能是vs的语法检测器出现了玄学bug。若有dalao看见这篇文章,知道应该怎么更好的解决这个bug,欢迎留言,我也会及时更新到这篇博文中,方便大家的。

[笔记][laravel]路由使用笔记v1.0

Laravel路由简介:
路由第一个参数是访问的路径,第二个参数是一个action
比如:
输出视图

Route::any('/',function(){
  return view('welcome');//输出模板welcome
});
Route::any('/',function(){
  return 'Hello World';//单纯的输出文字
});

一般路由器不会直接输出视图,只会用来绑定控制器,并且进行传参操作


路由传参

比如:
web.php

Route::any('/center/{id}','CenterController@id');

(注释:把id这个参数传入CenterController这个控制器的id这个方法)
app/Http/CenterController.php

namespace App\Http\Controllers;

class CenterController extends Controller{
  public function id($id){
return 'Member-ID-'.$id;
}
}

(注释:接收来自路由传入变量id)

Route::any('/center/{name?}','CenterController@id');

(注释:此处变量name后面的”?”的作用是说明该变量具有默认值,即可以在控制器中对应的方法中传参时设定一个默认参数,如果不使用该标识的话会导致访问时出现报错/404页面的出现)


路由参数过滤器

比如:
过滤单个参数

Route::any("/center/{id}",'CenterController@id')->where('id','[0-9]+');

过滤多个参数

Route::any("/center/{id}/{name}",'CenterController@id')->where(['id'=>'[0-9]+','name'=>'[A-Za-z]+']);

(注释:where把路由指向where函数即可启用过滤器,过滤器的第一个参数是要过滤的变量名,第二个参数是过滤的正则表达式,如果不遵循正则表达式的话,会先匹配其他路由规则,若无符合的规则,则会抛出404/错误)


Laravel路由类型:

  1. Get路由
  2. Post路由
  3. Any路由
  4. Match路由

下面将开始详解每一个路由的用法(个人总结的笔记)

Get路由

Route::get('/','ControllerName@MethodName');

顾名思义通过给服务器发起get请求时,可以触发该路由操作

Post路由

Route::post('/','ControllerName@MethodName');

只有当发起post请求时,才会触发该路由绑定的控制器
若直接访问该路由,将会抛出错误

Any路由(多请求路由)

Route::any('/','ControllerName@MethodName');

any路由其实就是post与get路由的结合体,可以通过使用post请求/get请求来访问该路由

Match路由(多请求路由)

Route::match(['get','post'],'/','ControllerName@MethodName');

在match路由中,该路由的第一个参数使用来配置该路由可以接受什么样的请求(详细可以接受什么样子的参数待以后再更新)


路由群组:

Route::group(['prefix'=&gt;'member'],function(){
    Route::any('user/member-center',['as'=>'center',function(){
        return route('center');
    }]);
    Route::get('/basic1',function(){
        return 'Hello world';
    });//GET路由
});

路由群组的作用:
可以把路由分门别类的放置到一个群组中,使用路由前缀进行访问
如localhost/member/basic1访问的就是位于member群组下的basic1路由


路由别名:

Route::get('user/member-center',['as'=>'center',function(){
    return route('center');//获取center路由的完整地址
}]);

路由别名的作用就是使用route时使用已预定好名字对应的路由
比如:route(‘center’)对应的就是localhost/user/member-center
如果此时需要修改url仅需要在路由这修改,即可做到全项目修改


目前笔记先做到这里,如果有错再更新

[笔记][laravel]安装指定版本的Laravel

安装

假设你要做一个博客的项目,打开命令行执行

composer create-project --prefer-dist laravel/laravel=5.5.* blog


其中:

5.*代表的是你所需要安装的laravel

blog项目的地址,一般是运行该指令时候的位置,此处可写全路径或者先使用查到移动目录后,再运行该指令,就会将laravel安装在移动后的目录中
blog 是你的项目目录,安装完成后所有的文件都会在这个目录中。

 

[笔记][laravel]安装拓展包

说明

我们都知道 Laravel 扩展包的注册会对应用造成消耗。有一些扩展包是开发环境中专用,生产环境中并不会使用到,为了避免无用的负载, 必须严格控制其安装和加载。


安装

安装开发专用扩展包时 必须 使用 --dev 参数,如:

composer require laracasts/generators --dev

加载

开发专用的 provider 绝不config/app.php 里面注册,必须app/Providers/AppServiceProvider.php 文件中使用如以下方式:

public function register()
{
    if ($this->app->environment() == 'local') {
        $this->app->register('Laracasts\Generators\GeneratorsServiceProvider');
    }
}

转载自:https://laravel-china.org/docs/laravel-specification/5.5/development-specific-extensions-package/513

若有侵权,请务必通过邮箱与我联系

C语言高精度计算

高精度乘法

#include "pch.h"
#include <iostream>
#include <stdlib.h>

int main()
{
char n1[1500], n2[1500];
int a[1500] = {'\0'};
int b[1500] = {'\0'};
int c[3000] = {0};
int m, n, i, j, o;
printf("请输入被乘数:\n");
scanf_s("%s",&n1,128);
m = strlen(n1);
printf("请输入乘数:\n");
scanf_s("%s",&n2,128);
n = strlen(n2);
if(m>n){o = m;}else{o = n;}
//将char类型的元素转换成int类型
for (i = 0, j = m - 1; i < m; i++, j--) {
a[i] = n1[j] - '0';
}
//将char类型的元素转换成int类型
for (i = 0, j = n - 1; i < n; i++, j--) {
b[i] = n2[j] - '0';
}
//用数组a的每一位跟数组b进行乘法操作
for (i = 0; i < m;i++) {
for (j = 0; j < n; j++) {
c[i + j] = c[i+j]+(a[i] * b[j]);
}
}
//处理进位
for (i = 0; i < m + n; i++) { if (c[i] >= 10) {//若该位大于10则向前进该处元素的十位数
c[i + 1] = c[i+1] + c[i] / 10;//20=>2,10=>1
c[i] = c[i] % 10;//取个位数
}
}
//由于存储c时是逆序存储,所以要再次逆序输出
for (i = o-1; i >=0;i--) {
printf("%d",c[i]);
}
printf("\n");
system("pause");
}


高精度加法

#include "pch.h"
#include <iostream> 
#include <stdlib.h>

int main()
{
	char n1[1500], n2[1500];
	int a[1500] = {'\0'};
	int b[1500] = {'\0'};
	int c[3000] = {0};
	int m, n, i, j,o;
	printf("请输入被加数:\n");
	scanf_s("%s",&amp;amp;n1,128);
	m = strlen(n1);
	printf("请输入加数:\n");
	scanf_s("%s",&amp;amp;n2,128);
	n = strlen(n2);
	for (i = 0, j = m - 1; i &amp;lt; m; i++, j--) {
		a[i] = n1[j]-'0' ;
	}
	for (i = 0, j = n - 1; i &amp;lt; n; i++, j--) { b[i] = n2[j]-'0' ; } if (m &amp;gt; n) { o = m; }
	else { o = n; }
	for (i = 0; i &amp;lt; o;i++) {
			c[i] = c[i]+(a[i] + b[i]);
	}
	for (i = 0; i &amp;lt; o; i++) { if (c[i] &amp;gt;= 10) {
			c[i + 1] =c[i+1]+( c[i] / 10);
			c[i] = c[i] % 10;
		}
}
	for (i = o-1; i &amp;gt;=0;i--) {
		printf("%d",c[i]);
	}
	printf("\n");
	system("pause");
}


高精度减法

#include "pch.h"
#include <iostream> 
#include <stdlib.h>

int main()
{
	char n1[1500], n2[1500];
	int a[1500] = { '\0' };
	int b[1500] = { '\0' };
	int c[3000] = { 0 };
	int m, n, i, j, o,flag=0;
	printf("请输入被减数:\n");
	scanf_s("%s", &amp;amp;n1, 128);
	m = strlen(n1);
	printf("请输入减数:\n");
	scanf_s("%s", &amp;amp;n2, 128);
	n = strlen(n2);
	for (i = 0, j = m - 1; i &amp;lt; m; i++, j--) {
		a[i] = n1[j] - '0';
	}
	for (i = 0, j = n - 1; i &amp;lt; n; i++, j--) { b[i] = n2[j] - '0'; } if (m &amp;gt; n) { o = m; }
	else { o = n; }
	for (i = 0; i &amp;lt; o; i++) {
		c[i] = c[i] + (a[i] - b[i]);
	}
	for (i = 0; i &amp;lt; o; i++) {
		if (c[i] &amp;lt; 0 &amp;amp;&amp;amp; flag != 1) { flag = 1; }//记录正负号
		if (c[i] &amp;lt; 0 &amp;amp;&amp;amp; a[i] == 0) { c[i + 1] = c[i + 1] - 1; c[i] = 10 - b[i]; } if (b[i] == 0 &amp;amp;&amp;amp; c[i] &amp;gt; 0) {
			c[i] = 10 - a[i];
			if (c[i + 1] &amp;gt; 0) { c[i + 1] = c[i + 1] - 1; }
			else {
				c[i + 1] = c[i + 1] + 1;
			}
		}
		if (c[i] &amp;lt; 0) { c[i] = -1 * c[i]; } } if (flag == 1) { printf("-"); } for (i = o-1; i &amp;gt;=0;i--) {
		printf("%d",c[i]);
	}
	printf("\n");
	system("pause");
}

高精度除低精度

#include "pch.h"
#include <iostream> 
#include <stdlib.h>

int main()
{
	char n1[1500];
	int n2;
	double a[3000] = { '\0' }, b[3000] = { 0 }, c = 0;
	int m, n, i, j, o,flag=0;
	printf("请输入被除数:\n");
	scanf_s("%s", &amp;amp;amp;n1, 128);
	m = strlen(n1);
	printf("请输入除数:\n");
	scanf_s("%d", &amp;amp;amp;n2, 128);
	if (n2 == 0) { printf("除数不可为0\n"); system("pause"); exit(0); }
	for (i = 0, j = m - 1; i &amp;amp;lt; m; i++, j--) {
		a[i] = n1[j] - '0';
	}
	for (i = 0,j=0; i &amp;amp;lt; m;i++,j++) { b[i] = b[i] + (a[i] / n2); for (o=j; o&amp;amp;gt;0; o--) {
			b[i] = b[i] * 10;
		}
	}
	for (i = 0; i&amp;amp;lt;m; i++) {
		c = c + b[i];
	}
	printf("%lf",c);
	printf("\n");
	system("pause");
}

原理:使用被除数的每一位进行除法运算,并将最终结果sum起来