C语言中的字符串,如何获取subString

时间:2010-01-22 01:35:54

标签: c

我有一个字符串:

char * someString;

如果我想要此字符串的前五个字母并想将其设置为otherString,我该怎么做?

12 个答案:

答案 0 :(得分:51)

#include <string.h>
...
char otherString[6]; // note 6, not 5, there's one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator

答案 1 :(得分:7)

char* someString = "abcdedgh";
char* otherString = 0;

otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;

<强>更新
提示:理解定义的好方法称为左右规则(最后的一些链接):

从标识符开始读取并说出aloud =&gt; “someString是......” 现在转到someString的右边(语句以分号结束,无话可说) 现在左转标识符(遇到*)=&gt;所以说“......指向......” 现在转到“*”左侧(找到关键字char)=&gt;说“.. char”。
完成!

所以char* someString; =&gt; “someString是指向char的指针。”

由于指针只是指向某个存储器地址,因此它也可以用作字符“数组”的“起始点”。

这适用于任何事情..试一试:

char* s[2]; //=> s is an array of two pointers to char
char** someThing; //=> someThing is a pointer to a pointer to char.
//Note: We look in the brackets first, and then move outward
char (* s)[2]; //=> s is a pointer to an array of two char

一些链接: How to interpret complex C/C++ declarationsHow To Read C Declarations

答案 2 :(得分:7)

广义:

char* subString (const char* input, int offset, int len, char* dest)
{
  int input_len = strlen (input);

  if (offset + len > input_len)
  {
     return NULL;
  }

  strncpy (dest, input + offset, len);
  return dest;
}

char dest[80];
const char* source = "hello world";

if (subString (source, 0, 5, dest))
{
  printf ("%s\n", dest);
}

答案 3 :(得分:5)

您需要为新字符串otherString分配内存。一般来说,对于长度为n的子字符串,这样的东西可能适合你(不要忘记做边界检查......)

char *subString(char *someString, int n) 
{
   char *new = malloc(sizeof(char)*n+1);
   strncpy(new, someString, n);
   new[n] = '\0';
   return new;
}

这将返回someString的前n个字符的子字符串。使用free()完成后,请确保释放内存。

答案 4 :(得分:4)

您可以使用snprintf精确获取char数组的子字符串。这是一个名为“substring.c”的文件示例:

#include <stdio.h>

int main()
{
    const char source[] = "This is a string array";
    char dest[17];

    // get first 16 characters using precision
    snprintf(dest, sizeof(dest), "%.16s", source);

    // print substring
    puts(dest);
} // end main

输出:

  

这是一个字符串

注意:

有关详细信息,请参见printf手册页。

答案 5 :(得分:2)

您可以将C字符串视为指针。因此,当您声明:

char str[10];

str 可用作指针。因此,如果您只想复制一部分字符串,则可以使用:

char str1[24] = "This is a simple string.";
char str2[6];
strncpy(str1 + 10, str2,6);

这将从第11个元素开始将 str1 数组中的6个字符复制到 str2 中。

答案 6 :(得分:0)

strncpy(otherString, someString, 5);

不要忘记为otherString分配内存。

答案 7 :(得分:0)

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

int main ()
{
        char someString[]="abcdedgh";
        char otherString[]="00000";
        memcpy (otherString, someString, 5);
        printf ("someString: %s\notherString: %s\n", someString, otherString);
        return 0;
}

如果不使用printf语句并将常量放在所有语句中,则不需要stdio.h,但最小的程序是错误的形式,应该避免使用。

答案 8 :(得分:0)

一举两得:

char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;

答案 9 :(得分:0)

char largeSrt[] = "123456789-123";  // original string

char * substr;
substr = strchr(largeSrt, '-');     // we save the new string "-123"
int substringLength = strlen(largeSrt) - strlen(substr); // 13-4=9 (bigger string size) - (new string size) 

char *newStr = malloc(sizeof(char) * substringLength + 1);// keep memory free to new string
strcpy(newStr, largeSrt, substringLength);  // copy only 9 characters 
newStr[substringLength] = '\0'; // close the new string with final character

printf("newStr=%s\n", newStr);

free(newStr);   // you free the memory 

答案 10 :(得分:0)

我认为这很简单...但我不知道如何直接传递结果变量然后我创建一个本地char数组作为temp并返回它。

<style>
    .rotate{
        -moz-transition: all 0.2s ease;
        -webkit-transition: all 0.2s ease;
        transition: all 0.2s ease;
    }
</style>

<div class="rotate" style="width: 100px; height: 100px; background-color: red;"></div>

<script>
    $(".rotate").click(function(){
        var rotate = 180;
        var elem = $(this);

        //get the current degree
        var currentDegree = 0;
        if(typeof(elem.attr('data-degree')) != 'undefined') {
            currentDegree += parseInt(elem.attr('data-degree'), 10);
        }

        //calculate the new degree
        var newDegree = currentDegree + rotate;

        //modify the elem css
        elem.css({ WebkitTransform: 'rotate(' + newDegree + 'deg)'});  
        elem.css({ '-moz-transform': 'rotate(' + newDegree + 'deg)'});
        elem.css('transform','rotate(' + newDegree + 'deg)');

        //store the degree for next time
        elem.attr('data-degree', newDegree);
    });
</script>

答案 11 :(得分:0)

此代码是 substr 函数,它模仿其他语言中存在的同名函数,只需解析:字符串,开头和字符数,如:

printf( "SUBSTR: %s", substr("HELLO WORLD!",2,5) );

以上将打印HELLO。如果您在字符串长度范围内传递值,则该值将被忽略,因为循环只会迭代字符串的长度。

char *substr(char *s, int a, int b) {
    char *r = (char*)malloc(b);
    strcpy(r, "");
    int m=0, n=0;
    while(s[n]!='\0')
    {
        if ( n>=a && m<b ){
            r[m] = s[n];
            m++;
        }   
        n++;
    }
    r[m]='\0';
    return r;
}