如何从字符串中获取字符串(C中的char指针)

时间:2016-03-21 16:39:29

标签: c string sockets http

问题很简单,但C语言没有为我们提供有用的库:

假设我们有这个字符串:

char *request  = "GET /websiteos/example_of_a_simple_html_page.htm HTTP/1.1\r\n";

如何获取以下字符串:

  

/websiteos/example_of_a_simple_html_page.htm

我正在寻找的字符串位于2个空格之间。问题是每次我都有一个新的请求行,所以我不知道字符串的大小。

我以为我会这样做,但它不起作用:

char * getTheResource(char *request){
char c;
int i=4;
char *resource=(char *)malloc(20);
while   (request[i] != ' ')
{   strcat(resource, request[i]);
    i++;
}
return resource;

}

int main( int n , char *arg[] )
{   
    char *request  = "GET /websiteos/example_of_a_simple_html_page.htm HTTP/1.1\r\nHost: help.websiteos.com\r\n\r\n";
    char *res =getTheResource(request);
    printf("the ressource is :%s\n",res);
}

我收到了编译错误:

  

在函数'getTheResource'中:
  example.c:19:3:警告:传递'strcat'的参数2使得整数指针没有强制转换[默认启用]
     strcat(resource,request [i]);

那么我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:3)

考虑使用strchr函数查找字符串中第一个空格的指针,然后将此指针再次增加1到strchr以获取指向字符串中第二个空格的指针,然后从中复制范围第一个指向第二个指向输出的指针并添加一个空终止符。

#include <string.h>
#include <stdio.h>

void f(const char* s, char* res) {
    char* l = strchr(s, ' ');
    char* r = strchr(l + 1, ' ');
    memcpy(res, l + 1, r - l);
    res[r - l - 1] = '\0';
}

int main() {
    const char* s = "sdfasdfasdf sadf sdfasdf";
    char res[1024];
    f(s, res);
    printf("%s\n", res);
    return 0;
}

答案 1 :(得分:2)

strcat(resource, request[i]);

这是错误的,因为request[i]类型为charstrcat需要char *

您可以使用resource运算符将字符分配给该索引处的=

int j = 0;
while(request[i] != ' ' && j < 19){  // Or the size you allocate to your pointer 
  resource[j] = request[i];
  i++;
  j++;
}
resource[j] = '\0';

编辑 -

您还可以使用strtok。使用空格作为分隔符并在标记化后获取所需的字符串(但在request中将char request[] = "your string";声明为main)。

答案 2 :(得分:0)

您的代码有几个问题。

strcat不应该用于复制单个字符,而是使用赋值。

您应该始终检查分配的返回值 - 在这种情况下使用calloc()而不是malloc(),以便缓冲区初始化为NUL字符以及分配。

你的while循环是非常危险的,因为它假设字符串至少有一个''。你应该确保始终检查,这样你就不会跑掉字符串的末尾。

如果请求字符串太短,则会遇到问题,因此请检查输入字符串的长度。

您必须确保有足够的空间来容纳新字符串,而不是超出新的字符串缓冲区。所以你需要一个#define来告诉你你可以适应新的缓冲区。

请记住,如果您使用getTheResource(),则必须释放()内存(如果您不打算退出应用程序)。这里不需要它,因为你要退出应用程序,但是如果你在代码中的其他地方使用getTheResource(),你应该在完成后释放返回的缓冲区。

最好释放()你的内存,因为它可以帮助你发现你没想到的错误 - 比如超出资源字符串缓冲区长度可能不会显示为错误,除非你试图释放缓冲区和然后操作系统抱怨。在你认为一切运行正常后(但事实并非如此),你会得到一些东西。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NEW_STRING_MAX_SIZE 100

char *getTheResource(char *request) {
   int i=4, j=0;
   char *resource;

   // validate input string is not NULL
   if ( !request )
      return NULL;

   // allocate and initialize buffer to hold new string
   if ( !( resource = (char *)calloc(1, NEW_STRING_MAX_SIZE) ) )
      return NULL;

   // validate input string is at least 4-characters
   if ( strlen( request ) <= i )
      return resource;

   // loop through old string copying to new string char by char
   while ( request[i] != '\0' && request[i] != ' ' && j < NEW_STRING_MAX_SIZE-1 )
       resource[j++] = request[i++]; // do a character assignment rather than strcat

   return resource;
}

int main( int n , char *arg[] )
{
    char *request = "GET /websiteos/example_of_a_simple_html_page.htm HTTP/1.1\r\nHost: help.websiteos.com\r\n\r\n";
    char *res = getTheResource(request);
    printf("the ressource is :%s\n",res);

    if ( res != NULL )
       free( res );
}