خطأ عندما أدعو strcmp تحويل غير صالح من 'الباحث' إلى 'CONST شار *

StackOverflow https://stackoverflow.com/questions/1635130

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا باستخدام strcmp لمقارنة صفائف حرف في ج ++، ولكن أنا الحصول على الخطأ التالي لكل قوع strcmp: خطأ: تحويل غير صالح من 'الباحث' إلى 'CONST شار * متبوعا: خطأ: تهيئة حجة 2 من "الباحث strcmp (CONST شار *، CONST تشار *) '

ولقد تشمل سلسلة، string.h، وstdio.h وهنا هو قانون بلدي، وذلك بفضل لجميع الذين الرد.

وبالإضافة إلى ذلك، هناك طريقة أفضل للتحقق المخزن المؤقت غير حفنة من إذا كانت تصريحات؟


int main(int argc, char* argv[])
{
    unsigned count = 0;
    bool terminate = false;
    char buffer[128];

do {
    // Print prompt and get input
    count++;
    print_prompt(count);
    cin.getline(buffer, 128);

    // check if input was greater than 128, then check for built-in commands
    // and finally execute command
    if (cin.fail()) {
        cerr << "Error: Commands must be no more than 128 characters!" << endl;
    }
    else if ( strcmp(buffer, 'hist') == 0 ) {
        print_Hist();
    }
    else if ( strcmp(buffer, 'curPid') == 0 ) {
        // get curPid
    }
    else if ( strncmp(buffer, 'cd ', 3) == 0 ) {
        // change directory
    }
    else if ( strcmp(buffer, 'quit') == 0 ) {
        terminate = true;
    }
    else {
        //run external command
    }

} while(!terminate);

return 0;

}

هل كانت مفيدة؟

المحلول

وسلسلة المقارنة غير صحيحة. ينبغي أن تكون النموذج "hist"، وليس 'hist'.

في C ++، 'hist' هو مجرد الطابع الحرفي (كما ورد في المقطع <م> 2.14.3 مشروع C ++ 0X (n2914) قياسي)، التشديد من عندي على الفقرة الأخيرة:

<اقتباس فقرة>   

وحرف الحرفي هو واحد أو أكثر من الأحرف المغلقة في علامات الاقتباس المفردة، كما هو الحال في 'س'، سبق اختياريا من جانب واحد من الحروف ش، U، أو L، كما هو الحال في u'y، U'z، أو L 'X'، على التوالي.

     

وحرف الحرفي الذي لا يبدأ مع ش، U، أو L هو الطابع العادي الحرفي، كما يشار إليه على أنه حرف الضيق الحرفي.

     

وعلى حرف العاديين الحرفي الذي يحتوي على واحد ج-شار تمت كتابة شار، مع قيمة مساوية لقيمة العددية للترميز ج-شار في مجموعة الأحرف التنفيذ.

     

على حرف العاديين الحرفي الذي يحتوي على أكثر من واحد ج-شار هو multicharacter الحرفي. A الحرفي multicharacter ديه نوع int وقيمة المعرفة من قبل التنفيذ.

وأما بالنسبة ليجري هناك طريقة أفضل، فإنه يعتمد على ما تعنيه أفضل: -)

واحتمال واحد هو إعداد جدول functon التي هي في الأساس مجموعة من البنيات، كل منها يحتوي على كلمة ومؤشر دالة.

وبعد ذلك يمكنك ببساطة استخراج كلمة من سلسلة الخاص بك والقيام بحث في هذا الصفيف، استدعاء الدالة إذا وجدت مباراة. يظهر البرنامج C التالية كيفية استخدام الجداول وظيفة. وعما اذا كان هذا هو أفضل الحل، سأترك الأمر متروك لكم (انها تقنية متقدمة معتدل) - قد تكون أفضل حالا العالقة مع ما فهمت

#include <stdio.h>

typedef struct {         // This type has the word and function pointer
    char *word;          // to call for that word. Major limitation is
    void (*fn)(void);    // that all functions must have the same
} tCmd;                  // signature.

// These are the utility functions and the function table itself.

void hello (void) { printf ("Hi there\n"); }
void goodbye (void) { printf ("Bye for now\n"); }

tCmd cmd[] = {{"hello",&hello},{"goodbye",&goodbye}};

// Demo program, showing how it's done.

int main (int argc, char *argv[]) {
    int i, j;

    // Process each argument.

    for (i = 1; i < argc; i++) {
        //Check against each word in function table.

        for (j = 0; j < sizeof(cmd)/sizeof(*cmd); j++) {
            // If found, execute function and break from inner loop.

            if (strcmp (argv[i],cmd[j].word) == 0) {
                (cmd[j].fn)();
                break;
            }
        }

        // Check to make sure we broke out of loop, otherwise not a avlid word.

        if (j == sizeof(cmd)/sizeof(*cmd)) {
            printf ("Bad word: '%s'\n", argv[i]);
        }
    }

    return 0;
}

عند تشغيل مع:

pax> ./qq.exe hello goodbye hello hello goodbye hello bork

وتحصل على الإخراج:

Hi there
Bye for now
Hi there
Hi there
Bye for now
Hi there
Bad word: 'bork'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top