复制字符串

时间:2017-12-09 16:02:09

标签: c string memcpy strcpy

我正在尝试在另一个字符串中复制字符串的一部分。 我知道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个字符。

我希望你能进一步帮助我。

3 个答案:

答案 0 :(得分:1)

您将需要一个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;

答案 1 :(得分:1)

如果输入字符串的格式已知,并且与发布的示例输入一致,则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 :(得分:0)

一种解决方案是从

中提取number.的所有字符
"GET / HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection" till `\r` is encounter.

Host:后开始提取 请记住使用&#39; \ 0&#39;

来终止字符串

该程序的简化版本:

#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!= '\0')
        {
            if( c == ' '){ 
            i++;
            continue;
            }

            ip[i++] = c;
        }
        else
        {
            ip[i] = '\0';
            break;
        }

     } // while

  }


   printf("Ip=%s", ip);
   return 0;
}

输出:

Ip=192.168.1.200