首页 > 解决方案 > strcmp 为相等的字符序列返回 false

问题描述

我有一个strcmp用来做决定的函数,见下文:

void get_data(file_observational_area * _file_observational_area, int dimensions, int * start_indices, int * end_indices) {
    char buffer[1024];
    FILE *file;
    size_t nread;

    if (NULL != _file_observational_area) {

        cout << "***_file_observational_area \n";

        if (NULL != _file_observational_area->_file) {
            //if the data is in a file 

            cout << "****_file_observational_area->_file \n";
            cout << "***_file_observational_area->_file->local_identifier:" << _file_observational_area->_file->local_identifier << "\n";
            cout << "***_file_observational_area->_file->file_name:" << _file_observational_area->_file->file_name << "\n";
            cout << "***data_file_local_identifier:" << data_file_local_identifier << "\n";

            if (strcmp(_file_observational_area->_file->local_identifier, data_file_local_identifier) == 1) {

                if (NULL != _file_observational_area->_file->file_name) {
                    //open the file 
                    file = fopen(_file_observational_area->_file->file_name, "r");
                    if (file) {
                        while ((nread = fread(buffer, 1, sizeof (buffer), file)) > 0)
                            cout << buffer << "\n";
                        if (ferror(file)) {
                            /* deal with error */
                        }
                    }
                }
            } else {
                cout << "***_file_observational_area  NOT A file \n";
            }

            if (NULL != file) {
                fclose(file);
                file = NULL;
            }
        }
    }

}

用于比较的 data_file_local_identifier 在 struct 中定义:

#ifndef DATA_FILE__H
#define DATA_FILE__H
#define data_file_local_identifier "file"

struct data_file
{
    char * file_name;
    char * local_identifier;

};

typedef struct data_file data_file; 

#endif /* DATA_FILE__H */

程序输出片段:

****_file_observational_area->_file 
***_file_observational_area->_file->local_identifier:file
***_file_observational_area->_file->file_name:A0087_0008_597249118_597252671_181130002623_eu.csv
***data_file_local_identifier:file
***_file_observational_area NOT A file 

在这行代码上面的 get_data 函数中:

      if (strcmp(_file_observational_area->_file->local_identifier, data_file_local_identifier) == 1)

返回 false 而不是 true,尽管如果您查看输出,两个字符串都是“文件”。那么为什么会失败呢?

标签: c++if-statementc-stringsstrcmp

解决方案


您似乎假设strcmp如果字符串相等则返回 1。

如果字符串相等则strcmp返回0,或者返回符号代表“较小”的数字:

返回一个整数值,表示字符串之间的关系:

<0 不匹配的第一个字符在 ptr1 中的值低于在 ptr2 中的值

0 两个字符串的内容相等

>0 第一个不匹配的字符在 ptr1 中的值大于在 ptr2 中的值


推荐阅读