字符串不返回主函数

Posted

技术标签:

【中文标题】字符串不返回主函数【英文标题】:String not returning to main function 【发布时间】:2014-01-07 03:44:46 【问题描述】:

我刚刚开始使用 c++,这是针对我正在进行的一个项目的。问题是我无法将 SearchFunction 中的字符串返回给 main。搜索功能本身可以完美且轻松地找到并显示它应该找到的行,但是尽管我从搜索功能返回了一个字符串,但字符串 temp 仍然为空。结果,DeleteFunction 不起作用,因为它没有被传递它应该删除的字符串。

我尝试过使用指针而不是返回值,但结果仍然相同。请帮助我了解我哪里出错了。

#include<iostream>
#include<stdio.h>
#include<string>
#include<fstream>
using namespace std;

string data,temp;

string SearchFunction(string);                  
void DeleteFunction(string);                    

int main()

    int choice=0,choice3=0;
    char yn1;
    string search;

    cout<<"1. Press 1 to delete."<<endl;
    cin>>choice;
    cin.clear();                                        
    cin.ignore(1000,'\n');                              

    if(choice==1)
       
        cout<<"Enter RegNo. of record to be deleted: ";
        getline(cin,search);                        
        search="RegNo.: "+ search;                  //Concatenate with "RegNo: " to ensure that the search is done "by RegNo".
        temp=SearchFunction(search);                

        cout<<"1. "<<temp<<"\n\n";
        cout<<temp.length()<<endl;

        cout<<"Are you sure you want to delete the above record of"<<search<<"? Y/N";
        yn1=getchar();
        cin.clear();                                        
        cin.ignore(1000,'\n');                          

        if(!(yn1=='y' || yn1=='Y' || yn1=='n' || yn1=='N'))
        
            do
            
                cout<<"Enter 'Y' or 'N': ";
                yn1=getchar();
            while(!(yn1=='y' || yn1=='Y' || yn1=='n' || yn1=='N'));
        

        if(yn1=='y' || yn1=='Y')
        
            DeleteFunction(temp);                   //Call delete function to delete record.
        
    
    return 0;



string SearchFunction(string search)


    int found=0, check=0;                               //Declare and initialize both variables to 0.
    ifstream outfile;                                   //Create object for reading file.

    outfile.open("student.txt");                        //Open file.

    while(!outfile.eof())                               //Continue loop until the end of file.
    
        found=0, check=0;                               //Initialize both variables to 0 again in anticipation of repititions.

        getline(outfile, data);                         //Input one row from file to string variable data.
        found=data.find(search, found);                 //Search for the search term in string data.
        if(found!=string::npos)                         //If search term found.
        
            cout<<data<<endl;                           //Display row.
        
    
    outfile.close();

    return data;


void DeleteFunction(string temp)

    string line;
    ifstream in("student.txt");
    if( !in.is_open())
    
        cout << "Input file failed to open\n";
    

    ofstream out("temp.txt");

    while( getline(in,line) )
    
        if(line != temp )
            out << line << "\n";
    
    in.close();
    out.close();    

    remove("student.txt");
    rename("temp.txt","student.txt");

【问题讨论】:

首先,while (!eof()) is wrong. 另外,返回的字符串没有理由成为全局变量。 注意数据是全局变量,为什么一定要返回呢?你可以在调用函数后在 main 中访问它。 为什么? when using comparison operators on string everything is done underneath using compare function. @ThomasMatthews:他们做不同的事情。一个结果是布尔值;另一个处于三态比较结果。 @user3116554,好吧,一旦你再次调用该函数,它就会改变。如果另一个函数没有预料到,kaboom。多线程的情况更糟。 【参考方案1】:

在找到要查找的行后,您已停止阅读文件。也许您想将功能更改为:

string SearchFunction(string search)


    int found=0, check=0;                               //Declare and initialize both variables to 0.
    ifstream outfile;                                   //Create object for reading file.

    outfile.open("student.txt");                        //Open file.

    // Also check if found!!!
    while(!outfile.eof() && !found)                     //Continue loop until the end of file.
    
        found=0, check=0;                               //Initialize both variables to 0 again in anticipation of repititions.

        getline(outfile, data);                         //Input one row from file to string variable data.
        found=data.find(search, found);                 //Search for the search term in string data.
        if(found!=string::npos)                         //If search term found.
        
            cout<<data<<endl;                           //Display row.
        
    
    outfile.close();

    return data;

【讨论】:

如果你找到了,为什么还要继续运行呢?为什么不在 cout 之后返回 while ? 不不,这就是你正在做的。这是错误的。抱歉,我的意思是:“你必须继续在 while 中运行”这就是为什么如果发现为真,你必须检查 while 语句。请参阅我发布的代码。 不是我 :) ,是的,你是对的,我混淆了 While 的陈述,仍然 Imo 最好在 if 内部返回 while ,然后在 while 外部返回字符串,如果你没有找到任何东西,因此您可以处理根本找不到。 @user2957713 我同意你的观点,但既然他说他刚刚开始使用 c++,我想给他一个回应,尽可能减少对代码的更改。移动 return 语句,甚至添加另一个对他来说可能不太容易理解。 @user3116554 也请使用 data 和 temp 作为局部变量。全局变量很糟糕。它不会改变这部分代码中的任何内容 -> 但它是养成不良习惯的好习惯,可能会导致未来的不良行为【参考方案2】:

找到数据后,您需要跳出while 循环。一个简单的方法是在那个时候直接return

除非有很好的理由,否则不要使用全局变量。如上所述,用作便签本变量的全局变量只是 Evil™。

【讨论】:

以上是关于字符串不返回主函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。

C语言试题三十一之判断字符串是否为回文?若是则函数返回1,主函数中输出yes,否则返回0,主函数中输出no。回文是指顺读和倒读都是一样的字符串。

将无符号字符数组返回到主函数

java 主函数

C语言strstr()函数(在主字符串里查找子字符串,返回第一次找到的子字符串以及后面的字符串)

c语言中主函数能调用自己吗?