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

起因:

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

char *p="Hello World";

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

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

解决办法:

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

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

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

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

C语言学习小结:

指针的初始化

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

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

指针运算符

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

例子:

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

运行结果:


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

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


指针偏移:

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

指针指向多维数组

#include <iostream>
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。

[笔记][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

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

[笔记][Laravel] .ENV文件应用设定-中文注释

APP_NAME=Laravel

|————————————————————————–
| Application Name-应用名称
|————————————————————————–
|
| 这个值是用来命名你的应用的. 这个值可以被框架用作警告时(?)被调用
| 同时这个这个值可以被应用或包应用
|

APP_ENV=local

|————————————————————————–
| Application Environment-应用环境
|————————————————————————–
|
| 这个Envirment用于定义你的引用在何处运行
| 这可能决定你会如何去配置多个应用程序的配置
| 在’.ENV’中可以设定该值
|

APP_KEY=base64:123213453dshkjch

|————————————————————————–
| Encryption Key-加密秘钥
|————————————————————————–
|
| 该秘钥将用于Laravel的加密函数并且该秘钥应是随机且有32位长
| 若不满足上述条件的话,使用加密函数加密的字符串将是不安全的
| 请在部署前先使用Artisan命令生成一个秘钥
|

APP_DEBUG=true

|————————————————————————–
| Application Debug Mode-应用程序调试模式
|————————————————————————–
|
| 当你开启该模式后,每当出现错误时,将会显示详细的错误提示(还有堆栈崩溃的位置)
| 提示(还有堆栈崩溃的位置).若您选择关闭该功能,系统将会使用一个简单的通用页来
| 代替.使用True来开启,使用False来关闭.
|

APP_LOG_LEVEL=debug

|————————————————————————–
| Logging Configuration-日志配置
|————————————————————————–
|
| 在这里你将就可以为你的应用配置日志记录服务,为此Laravel使用了Monolog PHP日志库.
| 使用该日志库将为您提供多样化的日志记录选项,并且你将可以使用强大的日志处理程序,
| 以及强大的日志格式化程序
|
| 可选的选项: “single”, “daily”, “syslog”, “errorlog”
|

APP_URL=http://localhost

|————————————————————————–
| Application URL-应用程序URL
|————————————————————————–
|
| 该URL是被用于在Artisan控制台模式中生成正确的网页链接的
| 在执行Artisan任务前,你应该设定该链接为你的应用程序的根目录地址
|

[笔记]C语言和AJAX开发小结[20181014]

C语言小结:


  • pow(double x) 输出也是float类型的值
  • if(表达式)[C语言的表达式中判断部分的值只能是int型或char型或bool型]*
  • 逗号表达式从左向右求值,输出的结果是最后一位的值
  • abs(int x) 求整型数值的绝对值
  • fabs(double x) 求双精度浮点型的绝对值
  • case (标签): 标签只能是数值/字符/字符串,不能是表达式**
  • sqrt(double x) 输出是double类型的值
  • 单个字符数据只能用(”)单引号来储存,多个字符才可以采用(“”)双引号来存储

*:if(a==2.34){}是不行的,除非把2.34当成字符串来存储,再进行判断才行

**:例:case a>b:是错误的


AJAX技术小结:


如果Console报错出现 CORS 头缺少 ‘Access-Control-Allow-Origin’

主要是因为跨域的锅,目前已知的解决办法有以下两种(maybe):

  1. ajax的url参数只使用php文件,如:data.php,即使服务器是自己的,强烈警告不要使用全链接来请求,如:www.boost.com/index.php这样来请求很容易报错
  2. 在请求页面的头部使用如下代码来解决:
    <meta http-equiv="Access-Control-Allow-Origin" content="*">

[笔记]谷歌浏览器不兼容select的option里onclick事件的解决方案

代码里在option 里加了onclick事件属性,平时多在firefox浏览器下开发,测试时发现以谷歌为内核的浏览器onclick事件无作用,查了下资料,在select里面用onchange就好了,如下:

<select onchange="update_show(this.options[this.selectedIndex].value)"></select>

[笔记]Linux基础入门

目录操作


创建目录

使用 mkdir 命令创建目录
mkdir $HOME/testFolder

(home是用户地主目录,登录后缺省进入的目录,比方说有个用户叫wang,那他的地主目录就是/home/wang,也能够用~wang表示。其实如果在安装Linux时选择中文版,桌面的目录就在$home目录下的“桌面目录”。)


切换目录

使用 cd 命令切换目录
cd $HOME/testFolder
使用 cd ../ 命令切换到上一级目录
cd ../

移动目录

使用 mv 命令移动目录
mv $HOME/testFolder /var/tmp

删除目录

使用 rm -rf 命令删除目录
rm -rf /var/tmp/testFolder

查看目录下的文件

使用 ls 命令查看/etc目录下所有文件和文件夹
ls /etc

(/etc 目录默认是 *nix 系统的软件配置文件存放位置)


文件操作


创建文件

使用 touch 命令创建文件
touch ~/testFile
执行 ls 命令, 可以看到刚才新建的 testFile 文件
ls ~

复制文件

使用 cp 命令复制文件
cp ~/testFile ~/testNewFile

删除文件

使用 rm 命令删除文件, 输入 y 后回车确认删除
rm ~/testFile

查看文件内容

使用 cat 命令查看 .bash_history 文件内容
cat ~/.bash_history

过滤,管道与重定向


过滤

过滤出 /etc/passwd 文件中包含 root 的记录
grep 'root' /etc/passwd
递归地过滤出 /var/log/ 目录中包含 linux 的记录
grep -r 'linux' /var/log/

管道

简单来说, Linux 中管道的作用是将上一个命令的输出作为下一个命令的输入, 像 pipe 一样将各个命令串联起来执行, 管道的操作符是 |
比如, 我们可以将 cat 和 grep 两个命令用管道组合在一起
cat /etc/passwd | grep 'root'
过滤出 /etc 目录中名字包含 ssh 的目录(不包括子目录)
ls /etc | grep 'ssh'

重定向

可以使用 > 或 < 将命令的输出重定向到一个文件中
echo 'Hello World' &gt; ~/test.txt

常用运维指令


Ping指令

对 cloud.tencent.com 发送 4 个 ping 包, 检查与其是否联通
ping -c 4 cloud.tencent.com

Netstat指令

netstat 命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等
列出所有处于监听状态的tcp端口
netstat -lt
查看所有的端口信息, 包括 PID 和进程名称
netstat -tulpn

Ps指令

过滤得到当前系统中的 ssh 进程信息
ps -aux | grep 'ssh'

资料来源:

腾讯云