首页 > 解决方案 > 解析字符串并将其存储为 char 数组时显示随机字节

问题描述

我正在尝试解析一个类似的字符串HTTP POST /abc/def/ghi/klm/mno,我想在其中分隔不同的组件,即协议、HTTP 动词和路径。

我正在使用strtok函数,然后使用函数复制字符串strlen。但是当我尝试打印字符串时,它会给出一些随机字节,如下所示。

在此处输入图像描述

我无法理解这其中的原因。这就是我正在做的事情。

struct my_con {
    char protocol[100];
    char method[100];
    char uri[100];
};

char* header = "HTTP POST /abc/def/ghi/klm/mno";

void my_func(my_con **mc) {
   char* p = strtok(header," ");
   int c = 0;
   while(p != NULL) {

       if(count == 0) strncpy((**mc).protocol, p, strlen(p));
       elseif(count == 1) strncpy((**mc).method, p, strlen(p));
       elseif(count == 2) strncpy((**mc).uri, p, strlen(p));
       count++;
       p = strtok(NULL, " ");
   }
}

标签: cstringpointers

解决方案


strspn并可strcspn用于遍历文字字符串。

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

int main ( void) {
    char* header = "HTTP POST /abc/def/ghi/klm/mno";
    char temp[100];
    int offset = 0;
    int span = 0;

    while ( header[offset]) {
        span = strspn ( header + offset, " ");//count spaces
        offset += span;//advance offset past spaces
        span = strcspn ( header + offset, " ");//count non-space
        if (span && span < 99) {
            strncpy ( temp, header + offset, span);
            temp[span] = 0;//terminate
            printf ( "%s\n", temp);
        }
        offset += span;//advance offset past non-space
    }

    return 0;
}

推荐阅读