我有一个字符指针,它有一个分配给它的字符串。我确信该字符串的长度为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 ++。
答案 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);