追加字符以获取字符串

时间:2009-12-23 18:49:06

标签: c string

我在C中有以下代码:

    char *str = "Hello World";
    char *s = malloc(strlen(str));
    int i =0;
    for(;i<strlen(str)-5;i++)
    {
        s += *(str+i);
    }
    printf(s);

它没有显示任何内容。我想要的是将str的子字符串存储在s

在Java中我会做以下事情:

    String str = "Hello World";
    String s="";

    for(int i=0;i<str.length()-5; i++)
        s+=str[i];

    System.out.println(s);

或者使用substring方法。例如String s = str.substring(1,2);

我怎样才能实现它?

9 个答案:

答案 0 :(得分:6)

使用strcpy功能。

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

int main(int argc, char *argv[] ) 
{
  char *str = "Hello World";
  size_t length = strlen(str);

  char *s = (char*)malloc(sizeof(char) * (length + 1));

  strcpy(s, str);

  s[length] = '\0'; // makes sure it's NUL terminated

  printf("%s", s);

  free(s);

  return 0;
}

分配目标缓冲区时,请注意字符串被NUL字符终止的事实。

要仅复制子字符串,请使用strncpy

strncpy(s, str + 6, strlen(str) - 6);

只会将“世界”复制到s

在任何情况下,在使用NUL等函数之前,请确保您的C字符串已printf终止。

另请参阅strcatstrncat。好吧,熟悉C数组和指针。

答案 1 :(得分:5)

其他人已经说过如何正确解决这个问题(strcat),但诀窍是考虑类型。 C不会为你做任何神奇的事情。 s是char *。当你向char *添加3时会发生什么?你得到另一个char *,它指向更远的3个字符。将“a”添加到char *与向指针添加97(ascii of“a”)相同,从而指向远离数组的另一个字符...

我希望能够解释发生了什么......

答案 2 :(得分:4)

您无法在+=对象上使用char*运算符 - 它只是指向char的指针。相反,您将需要使用strncpy,并将预先分配的缓冲区传递给它,并指向您希望复制开始的字符串中的位置,以及要复制的字符数。

答案 3 :(得分:2)

C字符串是指向内存中字符的指针,而不是其他语言中的对象。我建议您使用Google来解释字符串(例如this one),然后查看strcpy中定义的string.h函数。

答案 4 :(得分:0)

对于通常要从开头和结尾省略字符的子字符串,应使用strncpy或strncat。 (但要小心:strncpy不一定是NUL终止。)

答案 5 :(得分:0)

您需要为将保存子字符串的字符串分配内存。也许是这样的:

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

#define LESS 4
#define MAX 10 /*Keep it atleast strlen(str) - LESS + 1*/

int main(int argc, char *argv[] )
{

        char *str = "Hello World";
        char s[MAX]; /* Declare the array to hold the substring.*/
        int i =0,j=0; /* i is index into original string and j in the result string. */
        for(;i<strlen(str)-LESS;i++)
        {
                s[j++] = *(str+i);
        }
        s[j] = '\0'; /* Terminate the result string.*/
        printf("%s\n",s); /* Output: Hello W */

        return 0;
}

答案 6 :(得分:0)

您可以执行以下对代码的更改要求:

int main (int argc, char *argv[])
{
    char *str = "Hello World";
    char *s = malloc(strlen(str));
    int i = 0;
    for(;i<strlen(str)-5;i++)
    {
        s[i] = *(str+i);
    }
    s[i] = 0;

    printf(s);

   return 0;
}

答案 7 :(得分:0)

使用strncpy()

char *str = "Hello World";         
size_t len = strlen(str) - 5;   
char *s = malloc(len + 1); // +1 for nul terminator
if (s)            
{
  strncpy(s, str, len); // copies strlen(str)-5 characters from str to s
  s[len] = 0; // add nul terminator
}

一个更通用的功能:

/**
 * Return a substring of _len_ characters starting at position _start_
 * substring("Hello, World", 2, 3) == "llo"
 */
char *substring(char *str, size_t start, size_t len)
{
  char *s = malloc(len + 1);
  if (s)
  {
    strncpy(s, str+start, len);
    s[len] = 0;
  }
  return s;
}

根据需要添加健全性检查(例如,开始&lt; strlen(str),len&lt; = strlen(str) - start等)。

答案 8 :(得分:-1)

'+'不是C

中的字符串连接运算符