修改字符串指针中的字符串的一部分

时间:2014-01-27 19:02:13

标签: c

我有一个字符指针,它有一个分配给它的字符串。我确信该字符串的长度为8个字符。 (例如:SHIVA0BS)事实上,最后两个字母总是“BS”。但我只是要仔细检查一下。现在我想取前6个字符(“SHIVA0”)并将其附加到别的地方,比如说(“SHIVA0NN”) - 我怎么能让它成为可能呢?

     #include<stdio.h>
     #include<stdlib.h>
     void main()
     {
     char *ptr, *new;
     ptr = "FECI00BS";
     strncpy(new,ptr,6);
     printf("%s",new);
     strcat(new,"NN");
     }

以上代码就是我写的。而且我不确定它为什么不起作用。我明白我的要求非常简单,但我在其间尝试过printfs。我能够发现(ptr + 6)打印“BS”,所以6是我需要的长度。但这仍然无效。任何帮助赞赏。我需要一个字符串指针输出。一个新的很好。但是一个字符串指针。

P.S:只有C代码。没有C ++。

4 个答案:

答案 0 :(得分:2)

您没有分配内存来保存新字符串

char * new = calloc(1, 10); // on heap

char new[10]; // on stack
memset(new, 0, sizeof(new)); // zero it

答案 1 :(得分:1)

你没有为存储字符串分配内存。

您需要为* ptr和* new分配内存。

最低限度是:

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

int main()
{

    char *ptr, *new;
    new = (char*)malloc(sizeof(char) * 9);
    new = (char*)malloc(sizeof(char) * 9);
    ptr = "FECI00BS";
    strncpy(a,ptr,6);
    printf("%s",new);
    strcat(a,"NN");
    printf("%s",new);

}

你需要9个字节(假设你的平台每个字符需要一个字节),因为行尾字符'\ 0'需要出现在字符串的末尾才能使用一些string.h功能或正确打印。

另外,请阅读you need to be careful with strncpy的原因。根据您的平台,您可以从C标准中获得一些更新,更安全的替代方案。

答案 2 :(得分:0)

我想你想要:

sprintf(ptr+6, "NN");

这将修改您的缓冲区以将BS转换为NN。在这种情况下,您可以删除new变量。

修改

试试这个。请注意char ptr[]而不是char* ptr。通过使用[]而不是指针,您将在堆栈上分配缓冲区。这允许您写入缓冲区。

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

void main()
{
    char ptr[] = "FECI00BS";
    sprintf(ptr+6,"NN");
    printf(ptr);
}

答案 3 :(得分:0)

只需进行一些简单的检查memcpy()

char *ShivaAppend(char *dest, const char *ptr, const char *suffix) {
  size_t len = strlen(ptr);
  if (len != 8) {
    return NULL;
  }
  if (strcmp(ptr, "BS") != 0) {
    return NULL;
  }
  len = strlen(suffix);
  if (len != 2) {
    return NULL;
  }
  memcpy(dest, ptr, 6);
  memcpy(&dest[6], suffix, 2);
  return dest;
}

...
char dest[9];
char *p = ShivaAppend(dest, "SHIVA0BS", "NN")
puts(p == NULL ? "fail", p);