user-0 提问: C语言指针的问题

回复:
user: user-0
content: //第11章第9题 //花我好多天，主要是没有深入思考  //1. 失败程序  光标在闪，却无法输入了。  //when i == 0,pt1 = pt1 + i;making mistake!!!   #include <stdio.h> #include <string.h> const int N = 100; void space_delete (char * pt1);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt1)   { 	int i; 	char * temp ; 	 	while (*pt1)   	{                 	    //strlen（）与sizeof（)的不同  		temp = pt1; 	    if (*temp == ' ') 		   { 		       while (*temp != '\0')             	           { 		         *temp = *(temp + 1);    //这是一种算法？似乎做过相同的事.  		         temp++;                 //并不改变pt1指向的地址      			   } 	       } 	    if (*pt1 == ' ') 		   ; 		else 		   pt1++;   	   	 	} 	 }

user: user-0
content: [code=c//第11章第9题 //花我好多天，主要是没有深入思考  //1. 失败程序  光标在闪，却无法输入了。  //when i == 0,pt1 = pt1 + i;making mistake!!!   #include <stdio.h> #include <string.h> const int N = 100; void space_delete (char * pt1);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt1)   { 	int i; 	char * temp ; 	 	while (*pt1)   	{                 	    //strlen（）与sizeof（)的不同  		temp = pt1; 	    if (*temp == ' ') 		   { 		       while (*temp != '\0')             	           { 		         *temp = *(temp + 1);    //这是一种算法？似乎做过相同的事.  		         temp++;                 //并不改变pt1指向的地址      			   } 	       } 	    if (*pt1 == ' ') 		   ; 		else 		   pt1++;   	   	 	} 	 } ][/code] 自己慢慢写的，看了答案的。

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是赵4老师写到日志文件中一步一步分析出来的。  提醒：再牛×的老师也无法代替赵4老师自己领悟和上厕所！ 嘎嘎~~

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 我还需要努力啊

user: user-2
content: 引用 11 楼 sholber 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是赵4老师写到日志文件中一步一步分析出来的。  提醒：再牛×的老师也无法代替赵4老师自己领悟和上厕所！ 嘎嘎~~

user: user-4
content: 引用 4 楼 ShenTensen 的回复://第11章第9题  //刚刚是参考答案，这个是我写的，可是运行不了，不知道为什么 #include <stdio.h> #include <string.h> const int N = 50; void space_delete (char * pt);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt)   { 	int i,j; 	char * temp ; 	j = strlen(pt) + 1; 	 	while (*pt)   	{                 	    //strlen（）与sizeof（)的不同，此时pt1是数组还是字符串  	    i = 0;  		temp = pt; 	    while (*temp == ' ' )            //(pt1[i] == ' ') 		   { 			   		      *temp = *(temp + 1);     // wrong: pt1[i + 1] 		      temp++;                  //是否改变pt1指向的值  		      i++; 		       		   } 		    		pt = pt + i;            } 	     puts(pt);  //此处打印空行  	 } 修改如下：  //第11章第9题  //刚刚是参考答案，这个是我写的，可是运行不了，不知道为什么 #include <stdio.h> #include <string.h> //const int N = 50; #define N 50 void space_delete(char * pt); int main(void) { 	char pt[N]; 	gets(pt);  	while (*pt) 	{ 		space_delete(pt); 		puts(pt); 		gets(pt);  		//读取\n 之前的内容，加上‘\0’，丢弃\n  	} 	//所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	return 0; } void space_delete(char * pt) { 	int i, j; 	char *temp; 	j = strlen(pt) + 1; 	while (*pt) 	{ 		//strlen（）与sizeof（)的不同，此时pt1是数组还是字符串  		i = 1; 		temp = pt; 		//while (*temp == ' ')            //(pt1[i] == ' ') 		//{ 		//	*temp = *(temp + 1);     // wrong: pt1[i + 1] 		//	temp++;                  //是否改变pt1指向的值  		//	i++; 		//} 		if (' ' == *temp) 		{ 			while (*(temp + i) && ' ' == *(temp + i)) i++;   //找到下一个不是空格的字符 			while (*temp = *(temp + i)) temp++;   //移动 		} 		//pt = pt + i; 		pt++; 	} 	//puts(pt);  //此处打印空行  }

user: user-0
content: 我明白的是:改变的是pt指向的地址里的值，并不改变pt指向的地址。

user: user-0
content: 可这个是指针。能告诉我程序运行时为什么不能输入了吗？

user: user-0
content: 可这个是指针。

user: user-5
content: 如果你理解以下代码为何不能达到预期的目的，那么s被修改不会影响orig的值这个事实也应该是显而易见的 void swap(int a, int b) {     int temp;     temp = a;     a = b;     b = temp; }

user: user-0
content: //第11章第9题  //刚刚是参考答案，这个是我写的，可是运行不了，不知道为什么 #include <stdio.h> #include <string.h> const int N = 50; void space_delete (char * pt);  int main (void) { 	char pt[N]; 	gets(pt); 	 	while (*pt) 	{ 	   space_delete (pt); 	   puts(pt);        	   gets(pt); 	    	      //读取\n 之前的内容，加上‘\0’，丢弃\n  	}                   	     //所以在一行只输入回车，gets读取空字符  	printf("Bye!\n");  	 	return 0; }  void space_delete (char * pt)   { 	int i,j; 	char * temp ; 	j = strlen(pt) + 1; 	 	while (*pt)   	{                 	    //strlen（）与sizeof（)的不同，此时pt1是数组还是字符串  	    i = 0;  		temp = pt; 	    while (*temp == ' ' )            //(pt1[i] == ' ') 		   { 			   		      *temp = *(temp + 1);     // wrong: pt1[i + 1] 		      temp++;                  //是否改变pt1指向的值  		      i++; 		       		   } 		    		pt = pt + i;            } 	     puts(pt);  //此处打印空行  	 }

user: user-0
content: 其实就是不懂为什么orig指向字符串开头。orig的地址被传给s，既然s指向'\0',那为何orig不指向'\0'?

user: user-0
content: //本代码是把字符串中的空格字符去掉 #include <stdio.h> #define LEN 81 int drop_space(char * s); int main(void) { 	char orig[LEN];  	while (gets(orig) && orig[0] != '\0') 	{ 		drop_space(orig); 		//orig仍指向字符串的开头，当然不会为空行 		puts(orig);    //在被调函数中s指向了\o,此处为何可以继续打印一整行，而不是空行？  	} 	puts("Bye!"); 	return 0; } int drop_space(char * s) { 	int ct = 0;    //ct有何用？ //没用 	char * pos; 	while (*s)     /* or while (*s != '\0') */ 	{ 		if (*s == ' ') 		{ 			pos = s; 			do 			{ 				*pos = *(pos + 1);   //pt[i] = pt[i + 1]                				pos++; 			} while (*pos); 		} 		else 			s++;    //改变了s的地址，直到指向最后的\0  	} 	//   此处 puts(s); 为空行 //s指向了'\0'，当然是空行                         /*将s返回到被调函数，此时s指向‘\0',为何orig仍指向字符串的开头，*/                         /*因为orig与s不是同一个字符串吗？将orig传参给s } //为何主函数打印的不是个空行？？

user: user-4
content: 注释如下：  //本代码是把字符串中的空格字符去掉 #include <stdio.h> #define LEN 81 int drop_space(char * s); int main(void) { 	char orig[LEN];  	while (gets(orig) && orig[0] != '\0') 	{ 		drop_space(orig); 		//orig仍指向字符串的开头，当然不会为空行 		puts(orig);    //在被调函数中s指向了\o,此处为何可以继续打印一整行，而不是空行？  	} 	puts("Bye!"); 	return 0; } int drop_space(char * s) { 	int ct = 0;    //ct有何用？ //没用 	char * pos; 	while (*s)     /* or while (*s != '\0') */ 	{ 		if (*s == ' ') 		{ 			pos = s; 			do 			{ 				*pos = *(pos + 1);   //pt[i] = pt[i + 1]                				pos++; 			} while (*pos); 		} 		else 			s++;    //改变了s的地址，直到指向最后的\0  	} 	//   此处 puts(s); 为空行 //s指向了'\0'，当然是空行 } //为何主函数打印的不是个空行？？