作为一项家庭作业,我必须编写一个程序,用“ *”替换由3个字母组成的所有单词。
例如:
input: cod is everything and I love it
output: * is everything * I love it
这是我的程序:
int main()
{
char cuvant[101], final[101];
char* pch;
cin.get(cuvant, 100);
pch = strtok(cuvant, " ");
while (pch != NULL)
{
if (strlen(pch) == 3)
{
strcat(final, " *");
}
else
{
strcat(final, " ");
strcat(final, pch);
}
pch = strtok(NULL, " ");
}
cout << final;
}
我没有收到任何错误-但输出为空白。另外,该程序不会以代码0(应该是)退出,而是显示“已以代码-1073741819退出”。所以很明显正在发生什么事情。
我使用strtok / strcat错误吗?
我觉得无法在我的情况下使用strcat,这是导致错误的原因,但是我不确定。我说的对吗?
如果是,我该如何解决我的问题?
谢谢。
答案 0 :(得分:3)
您的问题是所有C-String
函数都希望您的字符串以null结尾(即,字符'\0'
是字符串的最后一个字符。
问题是final
未初始化。它可以包含任何数量的原始垃圾。因此,当您使用strcat()
时,它必须找到结尾(可能在任何地方)。
解决方案是初始化final
以确保其长度为零C-String
。
char cuvant[101];
char final[101] ={0}; // Fills the array with zero
或者。
char final[101];
final[0] = '\0'; // Make a C-String of length 0
返回码。
在C ++中,返回码为0。但是在C中,它是未定义的(因为您没有return语句)。因此,您使用C编译器而不是C ++编译器来编译代码。
未定义的值可以是任何值。值-1073741819
可以作为任何有效值。
答案 1 :(得分:2)
您需要初始化final
strcpy(final, "");
使它为null终止,然后再将其与strcat一起使用。
或只是设置
final[0] = 0;
答案 2 :(得分:1)
尝试使用“ c”
memset( cuvant, 0, sizeof( cuvant ));
memset( final, 0, sizeof( final ));
答案 3 :(得分:1)
C ++的字符串提取器在空白处分割输入;可以节省您很多解析。
std::string word;
std::string result;
while (std::cin >> word) {
result += ' ';
if (word.length == 3)
result += '*';
else
result += word;
答案 4 :(得分:1)
您可以使if语句如下所示:
if (strlen(pch) == 3)
{
strcat(final, "* ");
}
else
{
strcat(final, pch);
strcat(final, " ");
}
所以 final 字符串不会以终止字符开头。