user-0 提问: 指针等于"\0"  指针后面的字符会怎样

回复:
user: user-1
content: 引用 5 楼 weixin_45638884 的回复:[quote=引用 2 楼 自信男孩的回复:]  *p='\0'; 这可不是指针被赋值'\0'，而是指针指向的内存单元被赋值'\0'；这个问题要搞清楚。  注意p前面有一个*号。这是引用，即引用内存指向的内存单元，即指向的是s1的数组（某个位置）。 当然，p  = strstr(s1, s2);strstr的返回值有可能是NULL，因此代码存在健壮性问题。需要加一下判断，若p!= NULL时，*p = '\0';才可以。 否则会出现段错误～ 对呀 所以我说 是p后面的内容呀！[/quote] 不管会不会消失，你都不能再去用后面的内容！所以，研究这个没有意义，又不是要去搞黑客攻击

user: user-0
content: 引用 9 楼 自信男孩的回复:[quote=引用 6 楼 weixin_45638884 的回复:] [quote=引用 3 楼 自信男孩的回复:]后面的不会消失。只是再次用%s或puts输出时，'\0'后面的不会输出。但是后面的内容还在。 因为%s/puts都是输出字符串的，而输出字符串是遇到'\0'就停止输出的。 懂了点啦 就是gets这个函数的问题吧[/quote] 跟gets这句没关系，是因为p  = strstr(s1, s2); *p = '\0';主要是跟*p = '\0';有关系～[/quote] 好 对对 我懂啦 刚才把gets放到里面，输出了一下 确实

user: user-2
content: 引用 6 楼 weixin_45638884 的回复:[quote=引用 3 楼 自信男孩的回复:]后面的不会消失。只是再次用%s或puts输出时，'\0'后面的不会输出。但是后面的内容还在。 因为%s/puts都是输出字符串的，而输出字符串是遇到'\0'就停止输出的。 懂了点啦 就是gets这个函数的问题吧[/quote] 跟gets这句没关系，是因为p  = strstr(s1, s2); *p = '\0';主要是跟*p = '\0';有关系～

user: user-0
content: 引用 7 楼 自信男孩的回复:[quote=引用 5 楼 weixin_45638884 的回复:] [quote=引用 2 楼 自信男孩的回复:]  *p='\0'; 这可不是指针被赋值'\0'，而是指针指向的内存单元被赋值'\0'；这个问题要搞清楚。  注意p前面有一个*号。这是引用，即引用内存指向的内存单元，即指向的是s1的数组（某个位置）。 当然，p  = strstr(s1, s2);strstr的返回值有可能是NULL，因此代码存在健壮性问题。需要加一下判断，若p!= NULL时，*p = '\0';才可以。 否则会出现段错误～ 对呀 所以我说 是p后面的内容呀！[/quote] 不是给你回复了吗？不会消失呢。[/quote] 嗯嗯 只是不输出啦 有个gets函数

user: user-2
content: 引用 5 楼 weixin_45638884 的回复:[quote=引用 2 楼 自信男孩的回复:]  *p='\0'; 这可不是指针被赋值'\0'，而是指针指向的内存单元被赋值'\0'；这个问题要搞清楚。  注意p前面有一个*号。这是引用，即引用内存指向的内存单元，即指向的是s1的数组（某个位置）。 当然，p  = strstr(s1, s2);strstr的返回值有可能是NULL，因此代码存在健壮性问题。需要加一下判断，若p!= NULL时，*p = '\0';才可以。 否则会出现段错误～ 对呀 所以我说 是p后面的内容呀！[/quote] 不是给你回复了吗？不会消失呢。

user: user-0
content: 引用 3 楼 自信男孩的回复:后面的不会消失。只是再次用%s或puts输出时，'\0'后面的不会输出。但是后面的内容还在。 因为%s/puts都是输出字符串的，而输出字符串是遇到'\0'就停止输出的。 懂了点啦 就是gets这个函数的问题吧

user: user-0
content: 引用 2 楼 自信男孩的回复:  *p='\0'; 这可不是指针被赋值'\0'，而是指针指向的内存单元被赋值'\0'；这个问题要搞清楚。  注意p前面有一个*号。这是引用，即引用内存指向的内存单元，即指向的是s1的数组（某个位置）。 当然，p  = strstr(s1, s2);strstr的返回值有可能是NULL，因此代码存在健壮性问题。需要加一下判断，若p!= NULL时，*p = '\0';才可以。 否则会出现段错误～ 对呀 所以我说 是p后面的内容呀！

user: user-0
content: 引用 1 楼 真相重于对错的回复:打印出来都是乱码呀 这个程序是对的呀呀呀#include<stdio.h> #include<string.h> int main(){     char a[81],s1[81],s2[81],*p;     gets(s1);     gets(s2);     while((p=strstr(s1,s2))!=NULL){         strcpy(a,p+strlen(s2));         *p='\0';         strcat(s1,a);             }     puts(s1);     }

user: user-2
content: 后面的不会消失。只是再次用%s或puts输出时，'\0'后面的不会输出。但是后面的内容还在。 因为%s/puts都是输出字符串的，而输出字符串是遇到'\0'就停止输出的。

user: user-2
content: *p='\0'; 这可不是指针被赋值'\0'，而是指针指向的内存单元被赋值'\0'；这个问题要搞清楚。  注意p前面有一个*号。这是引用，即引用内存指向的内存单元，即指向的是s1的数组（某个位置）。 当然，p  = strstr(s1, s2);strstr的返回值有可能是NULL，因此代码存在健壮性问题。需要加一下判断，若p!= NULL时，*p = '\0';才可以。 否则会出现段错误～

user: user-3
content: 打印出来都是乱码呀

user: user-0
content: 引用 18 楼 千梦一生的回复:[quote=引用 16 楼 weixin_45638884 的回复:] [quote=引用 14 楼 千梦一生的回复:][quote=引用 13 楼 千梦一生 的回复:] [quote=引用 12 楼 千梦一生 的回复:] *p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。 另外： *p = "\0"恐怕会报错。[/quote]  因为*p的宽度是1B，而赋过来的值宽度应该是地址宽度4B云云。强行赋值只能丢失。 例如，原来p所指向的那字符串是 ”hello“。而"\0"（字符串）的地址是0x ff 33 22 11。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x11。 此时输出p的时候可能的结果是：”乱码ello“ 或者另一种情况"\0"（字符串）的地址是0x ff 22 11 00。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x00（‘\0’）。 此时输出p的时候可能的结果是：没有输出[/quote] 我的其实想问的是 在执行完 strcap后 为什么又让*P的内容为空。[/quote]  比如现在p = strstr(str1,str2);后 p 指向了“hello”；的'e'(str1里面的'e') 它此时将p = '\0'我也不知道他想要干嘛。 但结果就是str1原本内存中的'h','e','l','l','o','\0'变成了'h','\0','l','l','o','\0' 此时，如果时puts也好，printf也好，他们函数内部进行打印的时候都是规定以找到'\0'，作为终止。 即此时打印的结果将变成：h 如果这里你不置为'\0'则puts、printf这些函数将会一直打印下去直到遇到'\0'。内存中就是0  总的说：这个程序的功能就是打印出：str1中第一次出现str2字符串的位置之前的字符串[/quote] 对对 就是这个 就是这个答案 谢谢啦

user: user-4
content: 引用 16 楼 weixin_45638884 的回复:[quote=引用 14 楼 千梦一生的回复:][quote=引用 13 楼 千梦一生 的回复:] [quote=引用 12 楼 千梦一生 的回复:] *p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。 另外： *p = "\0"恐怕会报错。[/quote]  因为*p的宽度是1B，而赋过来的值宽度应该是地址宽度4B云云。强行赋值只能丢失。 例如，原来p所指向的那字符串是 ”hello“。而"\0"（字符串）的地址是0x ff 33 22 11。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x11。 此时输出p的时候可能的结果是：”乱码ello“ 或者另一种情况"\0"（字符串）的地址是0x ff 22 11 00。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x00（‘\0’）。 此时输出p的时候可能的结果是：没有输出[/quote] 我的其实想问的是 在执行完 strcap后 为什么又让*P的内容为空。[/quote]  比如现在p = strstr(str1,str2);后 p 指向了“hello”；的'e'(str1里面的'e') 它此时将p = '\0'我也不知道他想要干嘛。 但结果就是str1原本内存中的'h','e','l','l','o','\0'变成了'h','\0','l','l','o','\0' 此时，如果时puts也好，printf也好，他们函数内部进行打印的时候都是规定以找到'\0'，作为终止。 即此时打印的结果将变成：h 如果这里你不置为'\0'则puts、printf这些函数将会一直打印下去直到遇到'\0'。内存中就是0  总的说：这个程序的功能就是打印出：str1中第一次出现str2字符串的位置之前的字符串

user: user-0
content: 引用 15 楼 真相重于对错的回复:[quote=引用 4 楼 weixin_45638884 的回复:] [quote=引用 1 楼 真相重于对错的回复:]打印出来都是乱码呀 这个程序是对的呀呀呀#include<stdio.h> #include<string.h> int main(){     char a[81],s1[81],s2[81],*p;     gets(s1);     gets(s2);     while((p=strstr(s1,s2))!=NULL){         strcpy(a,p+strlen(s2));         *p='\0';         strcat(s1,a);             }     puts(s1);     }[/quote] 所谓的乱是跟程序规定而言的。 c字符串规定是以\0为结尾，再后面的不管是不是能打印出来，它都是不符合规定的。[/quote] 这个我倒是有点印象  c字符确实是 以\0结尾的

user: user-0
content: 引用 14 楼 千梦一生的回复:[quote=引用 13 楼 千梦一生 的回复:] [quote=引用 12 楼 千梦一生 的回复:] *p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。 另外： *p = "\0"恐怕会报错。[/quote]  因为*p的宽度是1B，而赋过来的值宽度应该是地址宽度4B云云。强行赋值只能丢失。 例如，原来p所指向的那字符串是 ”hello“。而"\0"（字符串）的地址是0x ff 33 22 11。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x11。 此时输出p的时候可能的结果是：”乱码ello“ 或者另一种情况"\0"（字符串）的地址是0x ff 22 11 00。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x00（‘\0’）。 此时输出p的时候可能的结果是：没有输出[/quote] 我的其实想问的是 在执行完 strcap后 为什么又让*P的内容为空。

user: user-3
content: 引用 4 楼 weixin_45638884 的回复:[quote=引用 1 楼 真相重于对错的回复:]打印出来都是乱码呀 这个程序是对的呀呀呀#include<stdio.h> #include<string.h> int main(){     char a[81],s1[81],s2[81],*p;     gets(s1);     gets(s2);     while((p=strstr(s1,s2))!=NULL){         strcpy(a,p+strlen(s2));         *p='\0';         strcat(s1,a);             }     puts(s1);     }[/quote] 所谓的乱是跟程序规定而言的。 c字符串规定是以\0为结尾，再后面的不管是不是能打印出来，它都是不符合规定的。

user: user-4
content: 引用 13 楼 千梦一生 的回复:[quote=引用 12 楼 千梦一生 的回复:] *p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。 另外： *p = "\0"恐怕会报错。[/quote]  因为*p的宽度是1B，而赋过来的值宽度应该是地址宽度4B云云。强行赋值只能丢失。 例如，原来p所指向的那字符串是 ”hello“。而"\0"（字符串）的地址是0x ff 33 22 11。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x11。 此时输出p的时候可能的结果是：”乱码ello“ 或者另一种情况"\0"（字符串）的地址是0x ff 22 11 00。 如果强行赋值 *p = "\0"。则存储‘h’这个字节的空间内容将变成0x00（‘\0’）。 此时输出p的时候可能的结果是：没有输出

user: user-4
content: 引用 12 楼 千梦一生 的回复:*p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。 另外： *p = "\0"恐怕会报错。

user: user-4
content: *p = ‘\0’ 我想你是这个意思。 此时你尝试打印p指向的字符串， 将不会有任何打印。