user-0 提问: 关于字符处理的问题

回复:
user: user-0
content: 谢谢你 明白了 给我写那么详细

user: user-0
content: *q=‘\0‘意思不是q指向的内容变成了‘\0‘ 这关dirPath什么事？ 引用 3 楼 turingo 的回复:从q = p;到 *q = '\0';，相当于中间字符串有被'\0'截断。  [quote=引用 楼主 yang362046076 的回复:]  char dirPath[MAX_PATH] = "";  char *p, *q; HANDLE hFile = INVALID_HANDLE_VALUE;   GetModuleFileName(NULL, dirPath, MAX_PATH); //获得这个exe执行文件的路径 	// printf("%s\n",dirPath);      p = dirPath;      while((p = strpbrk(p, "\\")) != NULL) //在字符串p中找到第一个\ 删除这个\前的字符串      {										          q = p;          p++;//去掉路径的第一个斜杠 ，指针向后移动一个字符的长度就可以删了 		      }      *q = '\0';      strcat(dirPath, ">");      printf("%s", dirPath); 比如原来dirPath='D:\OperatingSP1\Debug>Operating.exe' 最后输出的为什么是D:\OperatingSP1\Debug>  ？？？[/quote]

user: user-1
content: *q = '\0'  这是把\ 也就是字符'\\' 替换为字符串结束符'\0'； 那么对于字符串，后面的一切，都被无无视了。 因为'\0'是字符串结束符，是字符串的结束标志。 字符串到此结束。 无论是C的库函数，还是字符串常量（字面值）本身； '\0'都代表字符串到此为止，结束了。 所以对于，C字符串，'\0'有独特的含义。就是结束字符串。  *q 这种用法，代表指针的值，所表示的地址中的数据，即指针指向的内容。 所以这里的*，称为指针的解引用运算符。  指针的值是个地址。  这个地址里的数据的类型，就是指针的类型。 这个地址里的数据，就是指针所指的数据。  *q 就是指针q 所指的数据，就是“D:\OperatingSP1\Debug\Operating.exe” Operating.exe前面的\ 替换成\0  字符串，就成了“D:\OperatingSP1\Debug” 注意  \0是一个字符，即 char(0)值为 0的字符。                                实际内容是“D:\OperatingSP1\Debug\0Operating.exe” Operating.exe在\0后，不是字符串的一部分了。 所以字符串的值是“D:\OperatingSP1\Debug”  strcat(dirPath, ">");后  字符串，就成了“D:\OperatingSP1\Debug>” 实际内容是“D:\OperatingSP1\Debug>\0perating.exe” perating.exe在\0后，不是字符串的一部分了。 字符串通常用他的第一个字符的地址表示，并且以'\0'结束。  如果他的某个位置被替换为'\0'； 那么，此后的数据，对于字符串，就视为不存在了，所以Operating.exe这部分就被截断了。  如果一个字符串不是常量，那么可以把他的任意位置数据替换为'\0'， 后面的数据就不再是字符串的一部分了。

user: user-0
content: 谢谢，while 这段执行了之后P的内容是Operating.exe 主要是不懂 *q = '\0';这句处理之后dirPath为什么就会删去Operating.exe了？ 指针方面的不是很懂。。。都不好意思再问了 再把调试的两张图贴出来    引用 8 楼 lm_whales 的回复:抱歉，看错了。 下面是对这段代码的解析：  这个很自然，很好理解呀，估计帖主被注释误导了。 注释放到while 后面，产生了歧义。  那个注释，即可以理解为，循环结束后，找到的是第一个\，           也可以理解为，每循环一次，找到的是第一个\，           他实际表达的是，每循环一次，从 p 当前位置查找，找到的是第一个\，  这段while循环代码，其实是查找最后一个\，位置为指针q   [quote=引用 楼主 yang362046076 的回复:]  char dirPath[MAX_PATH] = "";  char *p, *q; HANDLE hFile = INVALID_HANDLE_VALUE;   GetModuleFileName(NULL, dirPath, MAX_PATH); //获得这个exe执行文件的路径 	// printf("%s\n",dirPath);      p = dirPath;      //找到最后一个"\\", while才会结束，q保存着最后一个"\\"的位置。      while((p = strpbrk(p, "\\")) != NULL) //在字符串p中找到第一个\ 删除这个\前的字符串      {										          q = p;          p++;//去掉路径的第一个斜杠 ，指针向后移动一个字符的长度就可以删了 		      }      *q = '\0';//这里把最后一个'\\' 替换为 '\0'      strcat(dirPath, ">");添加一个'>'      printf("%s", dirPath); 比如原来dirPath='D:\OperatingSP1\Debug>Operating.exe' 最后输出的为什么是D:\OperatingSP1\Debug>  ？？？//所以输出D:\OperatingSP1\Debug>  PS: 1）代码不要到处都是注释，代码最好是自注释的。    注释应该尽量的少，注释要简明扼要。 2）代码和注释要一致，不能有歧义。 3）代码更改后，要同时更改注释。 [/quote]

user: user-1
content: 抱歉，看错了。 下面是对这段代码的解析：  这个很自然，很好理解呀，估计帖主被注释误导了。 注释放到while 后面，产生了歧义。  那个注释，即可以理解为，循环结束后，找到的是第一个\，           也可以理解为，每循环一次，找到的是第一个\，           他实际表达的是，每循环一次，从 p 当前位置查找，找到的是第一个\，  这段while循环代码，其实是查找最后一个\，位置为指针q   引用 楼主 yang362046076 的回复: char dirPath[MAX_PATH] = "";  char *p, *q; HANDLE hFile = INVALID_HANDLE_VALUE;   GetModuleFileName(NULL, dirPath, MAX_PATH); //获得这个exe执行文件的路径 	// printf("%s\n",dirPath);      p = dirPath;      //找到最后一个"\\", while才会结束，q保存着最后一个"\\"的位置。      while((p = strpbrk(p, "\\")) != NULL) //在字符串p中找到第一个\ 删除这个\前的字符串      {										          q = p;          p++;//去掉路径的第一个斜杠 ，指针向后移动一个字符的长度就可以删了 		      }      *q = '\0';//这里把最后一个'\\' 替换为 '\0'      strcat(dirPath, ">");添加一个'>'      printf("%s", dirPath); 比如原来dirPath='D:\OperatingSP1\Debug>Operating.exe' 最后输出的为什么是D:\OperatingSP1\Debug>  ？？？//所以输出D:\OperatingSP1\Debug>  PS: 1）代码不要到处都是注释，代码最好是自注释的。    注释应该尽量的少，注释要简明扼要。 2）代码和注释要一致，不能有歧义。 3）代码更改后，要同时更改注释。

user: user-2
content: _splitpath, _wsplitpath Break a path name into components.  void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );  void _wsplitpath( const wchar_t *path, wchar_t *drive, wchar_t *dir, wchar_t *fname, wchar_t *ext );  Routine Required Header Compatibility  _splitpath <stdlib.h> Win 95, Win NT  _wsplitpath <stdlib.h> or <wchar.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameters  path  Full path  drive  Optional drive letter, followed by a colon (:)  dir  Optional directory path, including trailing slash. Forward slashes ( / ), backslashes ( \ ), or both may be used.  fname  Base filename (no extension)  ext  Optional filename extension, including leading period (.)  Remarks  The _splitpath function breaks a path into its four components. _splitpath automatically handles multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use. _wsplitpath is a wide-character version of _splitpath; the arguments to _wsplitpath are wide-character strings. These functions behave identically otherwise.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tsplitpath _splitpath _splitpath _wsplitpath    Each argument is stored in a buffer; the manifest constants _MAX_DRIVE, _MAX_DIR, _MAX_FNAME, and _MAX_EXT (defined in STDLIB.H) specify the maximum size necessary for each buffer. The other arguments point to buffers used to store the path elements. After a call to _splitpath is executed, these arguments contain empty strings for components not found in path. You can pass a NULL pointer to _splitpath for any component you don’t need.  Example  /* MAKEPATH.C */  #include <stdlib.h> #include <stdio.h>  void main( void ) {    char path_buffer[_MAX_PATH];    char drive[_MAX_DRIVE];    char dir[_MAX_DIR];    char fname[_MAX_FNAME];    char ext[_MAX_EXT];     _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" );    printf( "Path created with _makepath: %s\n\n", path_buffer );    _splitpath( path_buffer, drive, dir, fname, ext );    printf( "Path extracted with _splitpath:\n" );    printf( "  Drive: %s\n", drive );    printf( "  Dir: %s\n", dir );    printf( "  Filename: %s\n", fname );    printf( "  Ext: %s\n", ext ); }   Output  Path created with _makepath: c:\sample\crt\makepath.c  Path extracted with _splitpath:   Drive: c:   Dir: \sample\crt\   Filename: makepath   Ext: .c   File Handling Routines  See Also   _fullpath, _getmbcp, _makepath, _setmbcp

user: user-1
content: D:\OperatingSP1\Debug>是命令行提示符，显示当前路径， 可以让他不显示D:\OperatingSP1\Debug system("prompt $G"); > system("prompt $S"); 空格  Prompt /? 显示的帮助信息： PROMPT [text]    text    Specifies a new command prompt.  Prompt can be made up of normal characters and the following special codes:    $A   & (Ampersand)   $B   | (pipe)   $C   ( (Left parenthesis)   $D   Current date   $E   Escape code (ASCII code 27)   $F   ) (Right parenthesis)   $G   > (greater-than sign)   $H   Backspace (erases previous character)   $L   < (less-than sign)   $N   Current drive   $P   Current drive and path   $Q   = (equal sign)   $S     (space)   $T   Current time   $V   Windows XP version number   $_   Carriage return and linefeed   $$   $ (dollar sign)  If Command Extensions are enabled the PROMPT command supports the following additional formatting characters:    $+   zero or more plus sign (+) characters depending upon the        depth of the PUSHD directory stack, one character for each        level pushed.    $M   Displays the remote name associated with the current drive        letter or the empty string if current drive is not a network        drive.

user: user-3
content: q跟p相关，而p跟dirPath相关。  引用 4 楼 yang362046076 的回复:*q=‘\0‘意思不是q指向的内容变成了‘\0‘ 这关dirPath什么事？ [quote=引用 3 楼 turingo 的回复:] 从q = p;到 *q = '\0';，相当于中间字符串有被'\0'截断。  [quote=引用 楼主 yang362046076 的回复:]  char dirPath[MAX_PATH] = "";  char *p, *q; HANDLE hFile = INVALID_HANDLE_VALUE;   GetModuleFileName(NULL, dirPath, MAX_PATH); //获得这个exe执行文件的路径 	// printf("%s\n",dirPath);      p = dirPath;      while((p = strpbrk(p, "\\")) != NULL) //在字符串p中找到第一个\ 删除这个\前的字符串      {										          q = p;          p++;//去掉路径的第一个斜杠 ，指针向后移动一个字符的长度就可以删了 		      }      *q = '\0';      strcat(dirPath, ">");      printf("%s", dirPath); 比如原来dirPath='D:\OperatingSP1\Debug>Operating.exe' 最后输出的为什么是D:\OperatingSP1\Debug>  ？？？[/quote][/quote]

user: user-3
content: 从q = p;到 *q = '\0';，相当于中间字符串有被'\0'截断。  引用 楼主 yang362046076 的回复: char dirPath[MAX_PATH] = "";  char *p, *q; HANDLE hFile = INVALID_HANDLE_VALUE;   GetModuleFileName(NULL, dirPath, MAX_PATH); //获得这个exe执行文件的路径 	// printf("%s\n",dirPath);      p = dirPath;      while((p = strpbrk(p, "\\")) != NULL) //在字符串p中找到第一个\ 删除这个\前的字符串      {										          q = p;          p++;//去掉路径的第一个斜杠 ，指针向后移动一个字符的长度就可以删了 		      }      *q = '\0';      strcat(dirPath, ">");      printf("%s", dirPath); 比如原来dirPath='D:\OperatingSP1\Debug>Operating.exe' 最后输出的为什么是D:\OperatingSP1\Debug>  ？？？

user: user-0
content: 我知道没问题，就是不懂为什么输出的就是D:\OperatingSP1\Debug> 了 dirPath也没对它做什么操作啊？

user: user-4
content: 没有看出有问题