如何标记C字符串的结尾?

时间:2015-10-27 15:42:16

标签: c++ c

以下是该函数的代码:

void pattern(char word[200], char asPattern[200]) {
    for (unsigned i = 0; i < strlen(word); i++) { // unsigned to remove warning
        if (strchr("aeiou", word[i]) != 0) asPattern[i] = '*';
        else asPattern[i] = '#';
}

基本上,这个函数用#&#39; s代替#和#元音中的辅音,并将新模式存储在asPattern字符串中。但是,如果我在屏幕上显示asPattern,它会显示正确的模式,后跟一堆未知符号(strlen(asPattern)等于211或for循环之后的某个东西)。 我认为问题在于asPattern的结尾没有被标记出来     asPattern [strlen(asPattern)] =&#39; / 0&#39; 没有工作,我也不知道还能做什么......

我不能使用std :: string,所以请耐心地使用C字符串。

4 个答案:

答案 0 :(得分:6)

添加代码

asPattern[strlen(word)] = '\0';

在for-loop之前或之后

答案 1 :(得分:2)

C字符串以空字符结尾,可以用文字0或&#39; \ 0&#39;表示。使用C字符串(如strlen)的函数需要这样。请注意strlen()扫描字符串是否为空字符,所以你的循环:

for (unsigned i = 0; i < strlen(word); i++)

无效 - strlen()必须在每次迭代时扫描word。所以更好的代码可能是:

void pattern(char word[200], char asPattern[200]) {
    const unsigned len = strlen(word);
    for (unsigned i = 0; i < len; i++) { // unsigned to remove warning
        if (strchr("aeiou", word[i]) != 0) asPattern[i] = '*';
        else asPattern[i] = '#';
    }
    asPattern[len] = 0; // or '\0' if you prefer
}

答案 2 :(得分:2)

最简单,几乎万无一失的解决方案是将整个字符块设置为\0。这可以正常工作,假设您事先了解了char数组的实际大小。

#include <string.h>
void pattern(char word[200], char asPattern[200]) 
{
    memset(asPattern, '\0', 200);  // we are assuming that there really are 200  bytes
    //...
}

执行此操作后,您无需担心空终止符。

另外,请注意:

void pattern(char word[200], char asPattern[200]) 

与此无异:

void pattern(char* word, char* asPattern) 

实际上,该函数并不真正知道asPattern有多大。再说一次,如果你事先知道大小是多少,并且你知道你将会覆盖字符串,只需使用memset并忘记你是否应该使用strlen()或其他任何其他问题的麻烦方案可能会找出空字节的位置。

答案 3 :(得分:0)

我测试了你的功能,它运行正常。 (这是片段:http://rextester.com/XDSU30889

&#34; asPattern&#34;必须发送到已从任何内容中清除的功能(必须填写'\0' - s,这是GlobalAlloc()在Windows上的作用,否则请使用{{ 1}}然后malloc()