我编写了这段代码来查找一行中单词的出现次数。
它在我的Cygwin终端上运行良好。
但现在当我在我的Linux机器上运行它时,它会在strcpy(line, strstr(line,word))
为什么会出现这种行为?
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int findWord(char* line,char* word)
{
int count=0;
int wordLen = strlen(word);
while(true)
{
if( strstr(line,word) == NULL)
break;
strcpy(line, strstr(line,word)); //Crashes here
printf("@@%s\n",line);
strcpy(line,line+wordLen+1);
printf("##%s\n",line);
count++;
}
printf("%d\n",count);
return count;
}
int main()
{
cout << findWord("One Two Three Four One Two One Four","Three") << endl;
system("PAUSE");
return 0;
}
编辑:编辑标题。这对C和C ++都很常见
答案 0 :(得分:3)
你的指针行指向常量字符串“一二三四一二四”的(第一个字符)。您尝试覆盖此字符串,这是未定义的行为,因为应该允许C实现将其放入只读内存中。任何事情都可能发生。在Cygwin中,它碰巧按预期工作,而在Linux中它崩溃了。
答案 1 :(得分:0)
char* line
它的指针并将其指向一个常量字符串。编译器将其放在标记为只读的内存中。修改它会导致Undefined behaviour。