【问题标题】:cast a char into a char* in C在 C 中将 char 转换为 char*
【发布时间】:2021-11-30 14:26:47
【问题描述】:

我有一个 char 数组 s[11]="0123456789";,我希望能够获取每个数字 s[i](使用 for 循环)并以某种方式将其转换为 char*(我需要一个 char*,特别是因为我需要在其他字符串上使用 strncat)

在过去的 4 个小时里我一直在尝试这样做,但我无法完成任何事情。

【问题讨论】:

  • 执行s+i 以在i 位置获得char*
  • 如果想要字符串中的字符指针,可以使用&s[i],相当于(s+i)。如果您想将实际字符转换为指针,正如您的帖子所示,您可以使用(char *)s[i],尽管我无法想象这样做的有用目的。
  • 请注意,在大多数情况下,指向索引i 处的字符的指针不是指向单个字符串的指针。它是指向s 尾部的指针,从该索引开始。这看起来像一个 X-Y 问题。我有理由相信,真正的问题是 strncat 不是您实际尝试执行的工作的正确工具。
  • 如果您告诉我们上下文,例如作业的确切措辞,我们就不必猜测您要达到的目标。
  • 您不想“将 char 转换为 char *”。您只是想获取一个字符的地址。

标签: c pointers char


【解决方案1】:

除非你愿意临时修改s,或者将角色复制到其他地方......你会很难过。

暂时修改s

int main() {
  char s[11] = "0123456789";
  for (int i = 0; i < strlen(s); i++) {
    // Modify s in place.
    const char tmp = s[i+1];
    s[i+1] = '\0';
    char *substr = &s[i];
    // Do something with substr.
    printf("%s\n", substr);
    // Fix s
    s[i+1] = tmp;
  }
}

或者将s[i]复制到一个新的字符串中。

int main() {
  char s[11] = "0123456789";
  for (int i = 0; i < strlen(s); i++) {
    // Create a temporary string
    char substr[2];
    substr[0] = s[i];
    substr[1] = '\0';
    // Do something with substr.
    printf("%s\n", substr);
  }
}

或者也许只是不使用 strncat?

假设您实际上使用的是strncat 或类似的...这些函数非常简单,尤其是如果您只附加一个字符。您可以创建自己的版本。

void append_character(char *buffer, int buffer_size, char new_character) {
  int length = strlen(buffer);
  if (length + 2 < buffer_size) {
    buffer[length] = new_character;
    buffer[length+1]  = '\0';
  } else {
    // No space for an additional character, drop it like strncat would.
  }
}

或者您可以将其作为 strncat 的简单包装器:

void append_character(char *buffer, int buffer_size, char new_character) {
  char new_string[2] = { new_character, '\0' };
  strncat(buffer, buffer_size, new_string);
}

【讨论】:

    【解决方案2】:

    您的要求没有任何意义。 char 是一个很小的数字。指针是一些内存的地址。将 char 转换为指针不会给你一个有效的指针,而是一个一旦使用就会崩溃的指针。

    对于 strncat,您需要一个包含 C 字符串的字符数组。您可以通过编写 char array[2]; 创建一个字符串。 (现在你有一个包含两个字符空间的数组),然后 array[0] =whateverchar;数组[1] = 0;现在你有一个 C 字符串,其中有一个字符和一个尾随零字节的空间。

    【讨论】:

      【解决方案3】:

      还有一个想法:

      #include <stdio.h>
      #include <string.h>
      
      int main(void)
      {
          char src[11]="0123456789";
          char dest[50]="abc";
      
          char* p = src;
          int i = 0;
          int len = strlen(src);
          
          for (i = 0; i < len; i++)
          {
              strncat(dest,p,1);
              p++;
          }
          
          printf("src:  %s\n", src);
          printf("dest: %s\n", dest);
      
          return 0;
      }
      

      Ubuntu下用gcc编译:

      $ gcc hello_str.c -o hello_str
      

      输出:

      $ ./hello_str 
      src:  0123456789
      dest: abc0123456789
      

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 2012-07-01
        • 1970-01-01
        • 2013-12-31
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多