-2
char* s = (char*)malloc(5);

一些处理将可变数量的字节(数字)添加到字符串。例如 *s = 50;

我现在需要空终止字符串。这行得通。

*(s+1) = 0;

但是有没有更优雅的方式呢?

根据评论,这看起来像是这样做的方法

char* getvalue(char* str) {
   while((*str++ = getnextchar()) != 'H')
      ;

   *str = '\0'; /* null terminate */

   return str;
}
4

4 回答 4

2

使用calloc而不是malloc. 这会将内存设置为零。

于 2012-07-14T19:05:54.923 回答
1

假设您已经将某些内容s[0]作为“字符串”放入,您只需像这样终止:

s[1] = '\0';

但是,如果您发布更详尽的代码示例,通常有更好的方法将字符串复制到新缓冲区中。

于 2012-07-14T19:06:22.683 回答
1

假设 ASCII,你可以这样做:

snprintf(s = malloc(5), 5, "%s", "2");

的使用只是为了确保您的源字符串snprintf不会超出您的目标缓冲区,并且它总是会导致.\0s

如果您必须使用整数常量(或者它不是 ASCII):

snprintf(s = malloc(5), 5, "%c", 50);

您建议的例程不会检查输入是否会超出str缓冲区。API 应该接受一个大小参数,因此您可以检查以确保写入的字节数不会超出您的预期。如果要返回字符串的结尾,可以在函数的另一个参数中执行此操作。然后,您可以允许该函数返回是否已看到终止字符的指示。

int getvalue (char *str, size_t sz, char **endp) {
   char *end = str;
   while (--sz > 0)
      if ((*end++ = getnextchar()) == 'H') break;
   *end = '\0'; /* null terminate */
   if (endp) *endp = end;
   return end[-1] == 'H';
}
于 2012-07-14T19:11:12.763 回答
0

填充零(0) 和以 NULL('\0') 终止是两件不同的事情。如果您只想填零,请在 malloc 之后使用 memset 或只使用 calloc。

如果您希望字符串自动以 NULL 终止,请使用 strcpy/strncpy 将数据复制到其中。此函数将复制您的数据并添加终止 NULL。

于 2012-07-14T19:13:03.040 回答