复制字符串的子部分
copy a sub part of a string
我正在尝试将一个字符串的一部分复制到另一个字符串中。
我知道开始和结束子字符串的 2 个标识符。
我正在尝试从这个字符串中复制 IP:
0x200085f6 <memp_memory+4502> "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection
字符串的开头将是 "Host: " 或 192
结尾将是“\r\nC”或第二次出现“\r\n”
所以期望的输出是:
192.168.1.200
我试过使用 strcpy 和 memcpy,但 IP 必须是可变的,所以我不知道它会持续多长时间或会是多少,最少为 11 个字符,最多为 15 个字符。
希望你能进一步帮助我。
一种解决方案是从
中提取所有 number
或 .
的字符
"GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection" till `\r` is encounter.
Host:
后开始提取
请记住以 '\0' 结束字符串。
程序的简化版:
#include<stdio.h>
#include<string.h>
int main() {
char ip[64];
char *p = NULL;
char *str = "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection";
char c;
int i = 0;
int len;
len = strlen("Host ");
p = strstr(str,"Host: ");
if(p)
{
while(1)
{
c = *(p+i+len);
if(c != '\r' && c!= '[=11=]')
{
if( c == ' '){
i++;
continue;
}
ip[i++] = c;
}
else
{
ip[i] = '[=11=]';
break;
}
} // while
}
printf("Ip=%s", ip);
return 0;
}
输出:
Ip=192.168.1.200
您将需要一个 16 字节的缓冲区(每个八位字节最多 3 个字节,总共 12 个,加上三个点是 15,加上零终止符)。
然后,正如你所说,你需要精确定位你的阅读:
host = strstr(string, "Host: ");
if (!host) {
// Problem. Cannot continue, the string has not the format expected.
}
host += strlen("Host: ");
end = strstr(host, "\r\n");
if (!end) {
// Problem
}
// Sanity check: end - host must be less than 16. Someone could send you
// Host: 192.168.25.12.Hello.I.Am.Little.Bobby.Headers\r\n
if ((end - host) > 15) {
// Big problem
}
// We now know where the address starts, and where it ends.
// Copy the string into address
strncpy(address, host, (end-host));
// Add zero terminator to make this a C string
address[end-host] = 0x0;
如果输入字符串的格式已知,并且如张贴的示例输入所建议的那样,sscanf()
可以与 scanset 指令一起使用以提取 IP 地址。
使用 %*[^:]
会导致 sscanf()
匹配输入中的任何字符,直到遇到冒号。 *
禁止赋值。扫描以 :
字符继续,因此必须在格式字符串中放置一个文字 :
以匹配该字符。然后可以使用 %s
指令来匹配 IP 地址并将其存储为字符串。这是一个例子:
#include <stdio.h>
#define BUF_SZ 256
int main(void)
{
const char *input = "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection";
char ip_address[BUF_SZ];
if (sscanf(input, "%*[^:]: %255s", ip_address) == 1) {
puts(ip_address);
}
return 0;
}
程序输出:
192.168.1.200
我正在尝试将一个字符串的一部分复制到另一个字符串中。 我知道开始和结束子字符串的 2 个标识符。
我正在尝试从这个字符串中复制 IP:
0x200085f6 <memp_memory+4502> "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection
字符串的开头将是 "Host: " 或 192 结尾将是“\r\nC”或第二次出现“\r\n” 所以期望的输出是:
192.168.1.200
我试过使用 strcpy 和 memcpy,但 IP 必须是可变的,所以我不知道它会持续多长时间或会是多少,最少为 11 个字符,最多为 15 个字符。
希望你能进一步帮助我。
一种解决方案是从
中提取所有number
或 .
的字符
"GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection" till `\r` is encounter.
Host:
后开始提取
请记住以 '\0' 结束字符串。
程序的简化版:
#include<stdio.h>
#include<string.h>
int main() {
char ip[64];
char *p = NULL;
char *str = "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection";
char c;
int i = 0;
int len;
len = strlen("Host ");
p = strstr(str,"Host: ");
if(p)
{
while(1)
{
c = *(p+i+len);
if(c != '\r' && c!= '[=11=]')
{
if( c == ' '){
i++;
continue;
}
ip[i++] = c;
}
else
{
ip[i] = '[=11=]';
break;
}
} // while
}
printf("Ip=%s", ip);
return 0;
}
输出:
Ip=192.168.1.200
您将需要一个 16 字节的缓冲区(每个八位字节最多 3 个字节,总共 12 个,加上三个点是 15,加上零终止符)。
然后,正如你所说,你需要精确定位你的阅读:
host = strstr(string, "Host: ");
if (!host) {
// Problem. Cannot continue, the string has not the format expected.
}
host += strlen("Host: ");
end = strstr(host, "\r\n");
if (!end) {
// Problem
}
// Sanity check: end - host must be less than 16. Someone could send you
// Host: 192.168.25.12.Hello.I.Am.Little.Bobby.Headers\r\n
if ((end - host) > 15) {
// Big problem
}
// We now know where the address starts, and where it ends.
// Copy the string into address
strncpy(address, host, (end-host));
// Add zero terminator to make this a C string
address[end-host] = 0x0;
如果输入字符串的格式已知,并且如张贴的示例输入所建议的那样,sscanf()
可以与 scanset 指令一起使用以提取 IP 地址。
使用 %*[^:]
会导致 sscanf()
匹配输入中的任何字符,直到遇到冒号。 *
禁止赋值。扫描以 :
字符继续,因此必须在格式字符串中放置一个文字 :
以匹配该字符。然后可以使用 %s
指令来匹配 IP 地址并将其存储为字符串。这是一个例子:
#include <stdio.h>
#define BUF_SZ 256
int main(void)
{
const char *input = "GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection";
char ip_address[BUF_SZ];
if (sscanf(input, "%*[^:]: %255s", ip_address) == 1) {
puts(ip_address);
}
return 0;
}
程序输出:
192.168.1.200