如何在C语言中填充字符数组

9

从现在开始

char tval[20] = "temp:26.62";

如何在填充tval之前添加空格字符?最终需要获得这样的结果:
char tval[20] = "temp:26.62          ";

有没有什么方法能阻止你遍历整个数组并将每个 \0 设置为一个空格?公平警告,每个 c 字符串的末尾都需要一个 \0 终止符。 - Magisch
1
空格还是null?如果你需要null,那你已经完成了。 - Sourav Ghosh
空格。我是C语言的新手,到目前为止我在填充数组方面失败了。我只需要通过蓝牙发送20字节的数据。 - George I.
5个回答

12

大概就像这样

size_t prevlen = strlen(tval);
memset(tval + prevlen, ' ', 19 - prevlen);
*(tval + 19) = '\0';

1
最后一行是多余的。整个数组的其余部分都被初始化为 '\0'。编写一个 assert 会更好,因为当前代码可能隐藏了潜在的错误,如果程序员在 memset() 中使用不正确的常量值。最好使用 sizeof 来确定数组的大小,而不是使用常量值。 - this
2
请大家加些注释。我是一个新的C语言用户,可以读懂代码,但我还没有完全理解它;特别是memset()让我感到困惑。这里的投票被接受为答案,但我认为该答案缺乏解释,而下面的答案却有一些解释。 - shevy
像@shevy建议的那样,有人能否请评论一下这个代码吗?我是C语言新手,可以读懂它,但不知道为什么memset调用要构造成这样。我很想点赞,但还无法证明它的正确性。 - ifconfig
2
@ifconfig memset(tval + prevlen, ' ', 19 - prevlen); void *memset(void *s, int c, size_t n); memset函数会将temp:26.62后面的字节填充为空格,我们需要指定memset要填充多少个字节。这是通过计算19-prevlen得出的。19而不是20意味着我们留了一个字节给\0 - Karthick
@Karthick,将其作为答案的编辑会看起来好得多。在评论中,代码永远不会看起来完美。 - Joe

3
如果tval [20]是固定大小的,并且20始终是该大小,则可以遍历数组并执行以下操作:
char tval[20] = "temp:26.62";

现在发生的是,你的字符tval [20]看起来像这样:
{'t','e','m','p',':','2','6','.','6','2','\0'}

剩余部分将填充为\0

现在可以进行迭代:

for (int i = 0; i < 19; i++)
{
if (tval[i] == '\0')
   {
    tval[i] = ' ';
   }
}

重要的是你需要使用空字节来终止字符串。如果你不这样做,就不能在字符数组上使用任何字符串函数,因为这样做会导致未定义的行为。

最初它没有起作用,可能是因为 tval[i] == ' ';(请注意双等号)。 - George I.
额外的tval[19] = '\0';终止符是多余的。 - this

0

试试这个:

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

int main(void){
    char tval[20] = "temp:26.62";

    size_t length = strlen(tval);

    printf("Length of TVAL Before = %zu\n", length);

    while(length < 19){
        tval[length] = ' ';
        length++;
    }

    tval[19] = '\0';

    printf("Length of TVAL After =  %zu\n",length);
    printf("TVAL = %s\n",tval);

    return 0;
}

输出:

Length of TVAL Before = 10
Length of TVAL After =  19
TVAL = temp:26.62

你可以使用一个点来检查它:

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

int main(void){
    char tval[20] = "temp:26.62";

    size_t length = strlen(tval);

    printf("Length of TVAL Before = %zu\n\n", length);

    while(length < 19){

        tval[length] = ' ';
        length++;
    }

    tval[18] = '.';
    tval[19] = '\0';

    printf("TVAL = %s\n\n",tval);
    printf("Length of TVAL After =  %zu\n",length);

    return 0;
}

输出:

Length of TVAL Before = 10
TVAL = temp:26.62        .
Length of TVAL After =  19

额外的tval[19] = '\0';终止符是多余的。 - this

0
通常,表格是通过在大括号中指示数组元素列表来初始化的: char tval [] = {'H', 'e', 'l', 'l', 'o', '\ 0'}; 对于特殊情况下的字符数组,我们可以使用更方便的引导方式,只需声明一个常量字符串即可:
char tval [] = "Hello";

在[]初始化期间,计算机会自动保留链所需的字节数,即:字符数+1(这里是6个字节)。如果需要保留的字节数大于或等于初始化字符串的长度,我们也可以明确指定要保留的字节数。


4
好的,但这如何适用于这种情况? - Sourav Ghosh

0
char tval[20];
sprintf(tval,"%-*s",19,"temp:26.62");
...

或者

char tval[20] = "temp:26.62";
sprintf(tval,"%-*s",19,tval);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接