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

strspn Strange behavior under c++, why?

本文关键字:为什么 c++ strspn      更新时间:2023-10-16

这是我制作的一个程序:

#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中,然后两个标记器将两个指针设置到各自数组的第一个字,然后我应该返回值ij,它们是由strspn函数给定的int。

因此,当终端出现时,应该能够放置例如"veritas omnia vincit""vetirsa omnia vincit",然后得到7 7作为输出。

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

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

#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;
    }

该程序接收一个句子,从中删除所有元音,然后检查新形成的单词中是否有2个单词,其中一个是另一个的变位词。

eliminaVocali删除元音controlloParola在给定的时间提取句子中的一个单词,并将其发送给controlloAnagrammacontrolloAnagramma取单词并在整句中搜索变位词

该程序提供

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

其中testingstuff是程序名称。

问题应该在controlloAnagramma中,我在其中使用strlenstrspn

知道一个有用的事实:两个yolo cout都没有打印到主屏幕上。

请注意,这是一个教学程序,我只能将c++与<cstring>一起使用。

问题是,为什么strspn命令会有这种行为?它应该能解决大问题。提前谢谢。

编辑:

cin >> frase1;
cin >> frase2;

应为:

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

正如@anton savin所指出的。

还有

check = frase;

应该是

strcpy (check, frase);

错误仍然存在。

cin >> frase1;
cin >> frase2;

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

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