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

C++ 如何标记C字符串的结尾?,c++,c,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] = '#'; } void模

以下是该函数的代码:

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] = '#';
}
void模式(char-word[200],char-asPattern[200]){
for(unsigned i=0;i
基本上,此函数将word中的辅音替换为#,元音替换为*,并将新模式存储在asPattern字符串中。但是,如果我在屏幕上显示asPattern,它将显示正确的模式,后跟一组未知符号(strlen(asPattern)等于211或for循环后的其他内容)。 我认为问题在于asPattern的结尾没有标记和 asPattern[strlen(asPattern)]='/0' 不起作用,我不知道还能做什么

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

添加代码

asPattern[strlen(word)] = '\0';
在for循环之前或之后添加代码

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

在for循环之前或之后

C字符串都以空字符终止,空字符可以用文字0或“\0”表示。使用C字符串的函数(如strlen)需要这样做。请注意,
strlen()
扫描字符串中的空字符,因此循环:

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

C字符串以空字符结尾,空字符可以用文字0或“\0”表示。使用C字符串(如strlen)的函数需要空字符。请注意,
strlen()
扫描字符串中的空字符,因此循环:

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

我已经测试了您的函数,它运行良好。(以下是代码片段:)


“asPattern”必须发送到清除任何内容的函数(它必须充满
'\0'
-s,如果您在Windows上,这就是
GlobalAlloc()
所做的,否则使用
malloc()
然后
memset()
我已经测试了您的函数,它工作正常。(这是代码片段:)


必须将“asPattern”发送到清除任何内容的函数(它必须充满
'\0'
-s,这是
GlobalAlloc()
在Windows上所做的,否则使用
malloc()
然后
memset()

最简单、几乎万无一失的解决方案就是将整个字符块设置为
\0
。如果您事先知道字符数组的实际大小,则此操作是正确的

#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, char* asPattern) 

因此,实际上,该函数并不真正知道
asPattern
有多大。因此,再次强调,如果您预先知道大小,并且知道无论如何都会覆盖字符串,只需使用
memset
,忘记是否应该使用
strlen()这一令人头痛的问题
或其他任何可能的方案来确定空字节的位置。

最简单、几乎万无一失的解决方案就是将整个字符块设置为
\0
。如果您事先知道字符数组的实际大小,这一方法是正确的

#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, char* asPattern) 

因此,实际上,该函数并不真正知道
asPattern
有多大。因此,再次强调,如果您预先知道大小,并且知道无论如何都会覆盖字符串,只需使用
memset
,忘记是否应该使用
strlen()这一令人头痛的问题或其他任何可能的方法来计算空字节的位置。< /P>它是反斜杠而不是斜杠。你没有提到你是否可以使用算法函数。它们也与char数组一起工作,而不仅仅是代码> STD::String 。我建议删除C++标签,因为这个问题与C++无关。你的代码将如果元音是大写字母,则不起作用。读一本关于C的书并查找“字符串”你可以很容易找到答案。它是反斜杠而不是斜杠。你没有提到你是否可以使用算法函数。它们也与char数组一起工作,而不仅仅是代码> STD::String 。我建议删除C++标签,因为这个问题与C++无关。如果元音是大写字母,你的代码就不能工作。和查找“字符串”。您将很容易找到答案。一般来说,我建议使用
asPattern[strlen(asPattern)]
。也就是说,您正在
asPattern
的末尾设置NUL字符,所以使用
strlen()
a模式上,而不是在
word上。我知道它们应该具有相同的长度,但有时代码并不能达到预期的效果(想想更复杂的函数),在这种情况下,最好采用更安全的方法。出于同样的原因,当替换结束时,我会将这一行放在For循环之后。这样,您就不会按照您的期望工作:您只按照您所拥有的工作。@FabioTurati,
strlen
如何处理尚未终止的字符串?@Fabiotura
asPattern[strlen](asPattern)]
将崩溃。@Fabioturate如果我在asPattern上使用strlen(),它的大小将增长到200多(超过我设置的200的限制),我不知道为什么。使用strlen()“不过用词似乎很管用。@EugeneSh。每个人:上帝,我很愚蠢。对不起,你完全正确。要使用我的方法,必须通过其他方法知道长度。显然,这在这里没有意义。一般来说,我建议使用
asPattern[strlen(asPattern)]
。也就是说,您正在将NUL字符设置在
asPattern
的末尾,因此在
asPattern
上使用
strlen()
,而不是在
word
上。我知道它们应该具有相同的长度,但有时代码并不能达到预期的效果(想想更复杂的函数),在这种情况下,最好采用更安全的方法。出于同样的原因,当替换结束时,我会将这一行放在For循环之后。这样,您就不会按照您的期望工作:您只按照您所拥有的工作。@FabioTurati,
strlen
如何处理尚未终止的字符串?@Fabiotura
asPattern[strlen](asPattern)]
will c