【问题标题】:Iterate through input char argument in C?遍历C中的输入char参数?
【发布时间】:2017-08-02 12:32:53
【问题描述】:

我正在尝试遍历 C 中的输入参数,我将其存储在指向 char 的指针中,如下所示:const char *page = argv[1];

现在参数将是一个 http 地址,所以它可能看起来像这样:

http://host:port/folder1/folder2/file.jpg

我想要的是:解析这个字符串并将其分隔为子字符串

char host = "host"; 
char port = "port"; 
char path = "/folder1/folder2/file.jpg";
char file = "file.jpg"; 

所以我认为一个简单的 for 循环可以计算斜杠的数量,例如可以解决问题。

int slash_cnt = 0;
int i = 0;

for (i = 0, page[i] != '\0', i++)
{ 
    if (strcmp(&page[i], "/")) 
    { 
        slash_cnt++; 
    }
}

但这不起作用。

如果有人可以在这里帮助我,甚至建议一种更好的方法来解析输入中指定的 http 地址并相应地分隔它,我将非常感激!

【问题讨论】:

  • 好吧,我刚刚尝试编写自定义解析器,但您可以看到它不起作用,这就是我问这个问题的原因:)
  • strcmp() 比较字符串,而不是单个字符或字符串的一部分。 RTFM。
  • 好吧if (strcmp(&page[i], "/"))可以简化为if (page[i] == '/'))。您能否更清楚地说明您希望这个解析器做什么?如果你想清理一些东西,你可以拥有一个 char* 数组并通过枚举访问它们。无论如何,最好的办法是在指针 current pos 上调用strcpy - 您找到斜线(或字符串的乞求)的最后一个 pos。
  • @George - strcmp(&page[i], "/") 不等于 page[i] == '/'

标签: c command-line-arguments argv


【解决方案1】:

strstr 可用于搜索分隔感兴趣部分的字符串///:strrchr 可用于查找文件名之前的尾随 /

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

int main()
{
    char *page = "http://host:port/folder1/folder2/file.jpg";
    char *slashes = "//";
    char *slash = "/";
    char *colon = ":";
    char *start = NULL;
    char *stop = NULL;
    char *host = NULL;
    char *port = NULL;
    char *path = NULL;
    char *file = NULL;
    size_t span = 0;

    if ( ( start = strstr ( page, slashes)) == NULL) {
        fputs ( "could not find \"//\"\n", stderr);
        return 1;
    }
    start += strlen ( slashes);//move pointer so the slashes are excluded
    if ( ( stop = strstr ( start, colon)) == NULL) {
        fputs ( "could not find \":\"\n", stderr);
        return 1;
    }
    span = stop - start;
    if ( ( host = malloc ( span)) == NULL) {
        fputs ( "malloc failed\n", stderr);
        return 1;
    }
    memmove ( host, start, span);
    host[span] = '\0';

    start = stop + strlen ( colon);
    if ( ( stop = strstr ( start, slash)) == NULL) {
        fputs ( "could not find leading \"/\"\n", stderr);
        return 1;
    }
    span = stop - start;
    if ( ( port = malloc ( span)) == NULL) {
        fputs ( "malloc failed\n", stderr);
        return 1;
    }
    memmove ( port, start, span);
    port[span] = '\0';

    span = strlen ( stop) + 1;
    if ( ( path = malloc ( span)) == NULL) {
        fputs ( "malloc failed\n", stderr);
        return 1;
    }
    memmove ( path, stop, span);
    path[span] = '\0';

    if ( ( start = strrchr ( page, slash[0])) == NULL) {
        fputs ( "could not find trailing \"/\"\n", stderr);
        return 1;
    }
    start += strlen ( slash);
    span = strlen ( start) + 1;
    if ( ( file = malloc ( span)) == NULL) {
        fputs ( "malloc failed\n", stderr);
        return 1;
    }
    memmove ( file, start, span);
    file[span] = '\0';

    puts ( host);
    puts ( port);
    puts ( path);
    puts ( file);

    free ( host);
    free ( port);
    free ( path);
    free ( file);

    return 0;
}

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多