使用指针在 C 中解析 TFTP 数据包的字符串
Parsing a string of a TFTP packet in C using pointers
我使用 recvfrom 和 512 字节 缓冲区接收 TFTP 数据包(读取请求) .
字符串(要传输的文件名)从缓冲区的第三个字节开始。前两个是操作码的保留。
我写了下面的函数:
char * parseFileName(char * buffer){
char * filename;
for(int i = 0; buffer[i] != '[=10=]'; i++)
*(filename + i) = buffer[i];
*(filename + i) = '[=10=]';
return filename;
}
考虑到操作码偏移量,我称之为:
char * filename = parseFileName(buffer + 2);
但是,这不起作用并且程序停止:
printf("%s", filename);
除非我添加这个:
printf("\n");
就在 parseFileName 函数中的 return 语句之前。只有这样我才能在调用函数上打印文件名字符串。
为什么会这样?
因为您没有为char* filename
分配任何内存。
如果您知道字符串从 buffer+2 开始并且有 [=12=]
终止符,那么您可以直接执行:
char* parseFileName(char* buffer) {
return strdup(buffer);
}
char* fileName = parseFilename(buffer+2);
请注意,当您完成文件名时,这需要 free
。
我使用 recvfrom 和 512 字节 缓冲区接收 TFTP 数据包(读取请求) .
字符串(要传输的文件名)从缓冲区的第三个字节开始。前两个是操作码的保留。
我写了下面的函数:
char * parseFileName(char * buffer){
char * filename;
for(int i = 0; buffer[i] != '[=10=]'; i++)
*(filename + i) = buffer[i];
*(filename + i) = '[=10=]';
return filename;
}
考虑到操作码偏移量,我称之为:
char * filename = parseFileName(buffer + 2);
但是,这不起作用并且程序停止:
printf("%s", filename);
除非我添加这个:
printf("\n");
就在 parseFileName 函数中的 return 语句之前。只有这样我才能在调用函数上打印文件名字符串。
为什么会这样?
因为您没有为char* filename
分配任何内存。
如果您知道字符串从 buffer+2 开始并且有 [=12=]
终止符,那么您可以直接执行:
char* parseFileName(char* buffer) {
return strdup(buffer);
}
char* fileName = parseFilename(buffer+2);
请注意,当您完成文件名时,这需要 free
。