【问题标题】:Splitting a string into two and assigning to two char array将字符串一分为二并分配给两个 char 数组
【发布时间】:2020-01-30 14:25:45
【问题描述】:

我有一个类似的字符串:

my age is 22\r\n\r\n and I live in Rostock

以及其他一些字符串,例如:

I like to swim\r\n\r\n .Yesterday I competed with my 2 friends

现在我想用\r\n\r\n 分割一个字符串并将它与buffer 关联。这是我想要做的:

char buffer[500];
strcpy(buffer, "my age is 22\r\n\r\n and I live in Rostock");
char *p = buffer;
if((p = strchr(p,"\r\n\r\n"))) {
       p[strcspn(p,"tock")] = 0; // trying to slice until the end
}

printf("%s", p);

当我尝试编译时,这给了我一个警告,说warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast 我不明白这是什么意思。

还有什么好方法可以将其拆分为 2 个char 缓冲区?

【问题讨论】:

  • strchrstrchr 的第二个参数应该是 int,而不是 char *
  • 看起来你想要strstr
  • @Amanda 你可以使用 strtok。 strchr的调用无效/第二个参数应该是一个字符。
  • 如果字符串是可变的,则不需要将子字符串复制到另一个数组。例如"my age is 22\r\n\r\n and I live in Rostock",可以有两个char *,一个指向'm',另一个指向' '。用'\0' 覆盖"\r\n\r\n" 或仅覆盖第一个'\r'

标签: c arrays string char


【解决方案1】:

strchr 只需要 char 而不是第二个参数的字符串。所以你只能传递一个字符。

在 C 中,char 是单个字符,字符串是空字符数组。

你想做的大概是:

char buffer[500] = "my age is 22\r\n\r\n and I live in Rostock";  // directly initialize the char array

const char sep[] = "\r\n\r\n";

char * p = strstr(buffer, sep);   // search the separator
if (p) {
    *p = '\0';                    // null terminate the first part
    p += strlen(sep);             // make p point to the start of the second part
    printf("%s - %s\n", buffer, p);
}

如果你真的需要从缓冲区中清除初始部分并让它从第二部分开始,你可以这样做:

for (char *dest = buffer; p<buffer+sizeof(buffer)-1;) {   // do not go past end of array
    *dest++ = *p++;
    if (*p == '\0') break;         // stop on first null
}

【讨论】:

  • buffer 如何只指向第一部分? buffer 什么时候被修改?我有点困惑。我理解了p 部分,但不明白buffer 是如何获得第一部分的?
  • @Amanda:正如我所说,字符串是一个 null 终止 字符数组,这意味着它在第一个 null 字符处停止。在strstr 调用之后,p 指向buffer 中的第一个\r*p = 0; 将该字符替换为 null,实际上截断了从 buffer 开始的字符串。神奇的是,当数组用作指针时,它会自动衰减为指向其第一个元素的指针。
  • @Amanda:这种char指针处理并不是真正的技巧,而是惯用的C语言:-)
  • 有没有办法,我可以把\r\n\r\n 后面的最后一部分放在buffer 里面?我试过strcpy(buffer, p),但很多时候我看到一个错误ERROR: AddressSanitizer: strcpy-param-overlap: memory ranges ..
  • @Amanda: p 指向 bufferstrcpy 不希望将缓冲区复制到自身。它可以手动获得,但除非您有充分的理由,否则应避免使用它。这实际上会很棘手......
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2014-06-08
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多