以下是该函数的代码:
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字符串。
答案 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()