strspn c ++下的奇怪行为,为什么?

时间:2015-07-06 20:48:57

标签: c++ pointers strlen

这是我制作的一个程序:

#include <iostream>
#include <cstring>
using namespace std;

int main() {

    char frase1 [100];
    char frase2 [100];

    cin >> frase1;
    cin >> frase2;

    char * parola1 = strtok (frase1, " .");
    char * parola2 = strtok (frase2, " .");

    int i;

    i = strspn (parola1, parola2);

    int j;

    j = strspn (parola2, parola1);

    cout << i << " " << j;

    return 0;
}

它应该要求将2个句子存储到frase1frase2中,然后两个标记器设置两个指向其各自数组的第一个单词的指针,然后我应该返回值{{ 1}}和i,由j函数给出的整数。

因此,当终端显示时,应该能够放置strspn"veritas omnia vincit",然后将"vetirsa omnia vincit"作为输出。

相反,我插入第一个句子,它返回第一个句子的第一个和第二个单词(veritas,omnia)之间的strspn值。

这是尝试隔离出现在我将立即向您展示的更大程序中的问题:

7 7

这个程序收到一个句子,从中删除所有的元音,然后检查新形成的单词中是否有2个是另一个的字谜。

eliminaVocali删除元音 controlloParola在给定时间取一个单词并将其发送给controlloAnagramma controlloAnagramma接受单词并在整个句子中搜索anagram

该程序提供

  

1 [main] testingstuff 93304 cygwin_exception :: open_stackdumpfile:   将堆栈跟踪转储到testingstuff.exe.stackdump

teststuff是程序名称。

问题应该是controlloAnagramma,我使用#include <iostream> #include <cstring> using namespace std; void eliminaVocali (char [], char []); int controlloAnagramma (char*, char []); bool controlloParola (char[]); int main() { char frase [10]; cin >> frase; cout << "yolo1"; char fraseCorretta [100]; cout << "yolo"; eliminaVocali(frase, fraseCorretta); if (controlloParola(fraseCorretta)) cout << "TRUE!!"; else cout << "FALSE :("; } void eliminaVocali (char frase [], char fraseCorretta []){ int counter = 0; for (int i = 0; i < 100; i++){ if (frase[i] != 'a' && frase[i] != 'e' && frase[i] != 'i' && frase[i] != 'o' && frase[i] != 'u'){ fraseCorretta[counter] = frase[i]; counter++; } } } bool controlloParola (char frase []){ char * parola = strtok (frase, " ."); if (controlloAnagramma (parola, frase) > 2) return true; while (parola != NULL){ parola = strtok(NULL, " ."); if (controlloAnagramma (parola, frase) > 2) return true; } return false; } int controlloAnagramma (char * parola, char frase []){ int counter = 0; char * check = new char [100]; check = frase; char * parola2 = strtok (check, " ."); if (strlen(parola) == strlen(parola2) && strlen(parola) == strspn(parola, parola2) && strlen(parola) == strspn(parola2, parola)) counter++; while (parola2 != NULL){ parola2 = strtok (NULL, " ."); if (strlen(parola) == strlen(parola2) && strlen(parola) == strspn(parola, parola2) && strlen(parola) == strspn(parola2, parola)) counter++;} delete[] check; return counter; } strlen

知道可能有用的事实:主要的2 yolo strspn都没有打印过。

请注意这是一个教学计划,我只能在cout使用c ++。

问题是,为什么<cstring>命令会以这种方式运行?它应该解决大计划。提前谢谢。

编辑:

strspn

Shoud be:

cin >> frase1;
cin >> frase2;

正如@ anton-savin指出的那样。

另外

cin.getline(frase1, 100);
cin.getline(frase2, 100);

应该是

check = frase;

无论如何都会出现错误。

1 个答案:

答案 0 :(得分:2)

cin >> frase1;
cin >> frase2;

operator>>逐字逐句地读取字符串,因此frase1变为"veritas"frase2变为"omnia"。要逐行阅读输入,请使用getline

cin.getline(frase1, 100);
cin.getline(frase2, 100);