C++ 这里有非法进入吗?

C++ 这里有非法进入吗?,c++,C++,我正在检查字符串中的字母数字字符,并希望构建一个文件系统 我尝试过递归地使用Fnameisaln,但它给了我一个无效的指针,被中止(核心转储错误) 调试时-“程序接收信号SIGABRT,中止” 也许我不能修改成员字符串两次?有这样的规定吗 class File { public: std::string n; File(char str[]) { n = Fnameisaln(str); } std::string Fnamei

我正在检查字符串中的字母数字字符,并希望构建一个文件系统

我尝试过递归地使用Fnameisaln,但它给了我一个无效的指针,被中止(核心转储错误)

调试时-“程序接收信号SIGABRT,中止”

也许我不能修改成员字符串两次?有这样的规定吗

 class File
 {
 public:
     std::string n;

     File(char str[]) {
         n = Fnameisaln(str);
     }

     std::string Fnameisaln(char a[]);
 };

 std::string File::Fnameisaln(char b[]) {
     int i = 0;
     bool isaln = false;  
     while(b[i]!='\0'){
           if(isalnum(b[i]))  {
                       isaln=true;
                        i++;
                        std::cout<< "\nWorking\n";
          }
          else {
                      isaln=false;
                      std::cout << "Warning!\n";            
                      break;
         }
 }// (while loop for checking if alphanumeric)

     if(isaln) {
         std::string s = b;
         std::cout << "\n W2 \n"; // to check if working
         return s;
     }
     else {
         std::cout << "Please enter file name again-\n";
         std::cin >> b;
         n.assign(Fnameisaln(b));  // n=Fnameisaln(b) also tried
     }
}
类文件
{
公众:
std::字符串n;
文件(char str[]){
n=Fnameisaln(str);
}
std::字符串Fnameisaln(char a[]);
};
std::string File::Fnameisaln(char b[]){
int i=0;
bool-isaln=false;
而(b[i]!='\0'){
if(isalnum(b[i])){
isaln=真;
i++;

std::cout此代码存在问题-

  • 他并不总是回来
  • 正在使用带字符串的冗余字符数组
  • 使用的变量太多
  • 没有使用对字符串的引用
工作溶液-

  class File{
            public:
            std::string n;
            File(std::string n){
                            this->n=Fnameisaln(n);
            };
           std::string Fnameisaln(std::string& n);
           void printn();
  };

       void File::printn(){
                       std::cout << this->n << "\n";
        } 
        std::string File::Fnameisaln(std::string& b){
                 int i=0;
                 bool isaln=false;
                 while(b[i]!='\0'){
                                if(isalnum(b[i])) {
                                           isaln=true;
                                            i++;
                                 }

                              else  {
                                 isaln=false;
                                 std::cout << "Warning!\nOnly letters and numbers allowed!\n";
                                 break;
                              }
               }

              if(isaln) {
                      return b;
               }

               else {
                      std::cout << "Please enter file name again-\n";
                      std::cin >> b;
                      n=Fnameisaln(b);
                      return n;
               }
       }
类文件{
公众:
std::字符串n;
文件(std::string n){
这->n=Fnameisaln(n);
};
std::string Fnameisaln(std::string&n);
void printn();
};
无效文件::printn(){

std::无法修复缩进并显示完整的代码。
Fnameisaln
并不总是返回值。编译器至少应该警告您这一点,更重要的是这应该是一个错误。为什么要使用字符数组和
std::string
?您应该传递
std::string
(通过引用)请显示完整的代码。错误可能不在您认为的地方——可能在您剪掉的代码中(特别是当您有一个while循环正在扫描字符时,这种错误已经成熟)。你把它放在调试器中了吗?调试器会在大约5秒钟内告诉你问题出在哪里。你的类似乎有点过头了。太多东西了,当一个简单的文件名字符串可以工作时。