簡體   English   中英

C將const char *轉換為char

[英]C convert const char * to char

我搜索好半天才找到了答案,但我只找到一個解決方案C++ ,這似乎不是為工作C 我正在嘗試將const char *參數轉換為char以在我的switch語句中使用。 我嘗試了各種各樣的東西,比如strdup() ,但沒有成功。

#include <stdio.h>

int main(int argc, const char *argv[]) {

    char argOne = argv[1];
    char argTwo = argv[2];

    switch(argOne) {
        case '1234' :
            printf("1234!\n" );
            break;
        default :
        printf("Invalid\n" );
    }
}

編譯時:

警告:指向整數轉換的不兼容指針使用類型為'const char *'的表達式初始化'char'[-Wint-conversion]

 char argOne = argv[1]; ^ ~~~~~~~ 

警告:溢出轉換案例值到切換條件類型(825373492到52)[-Wswitch]

 case '1234' : ^ 

在你的代碼中,

  • 第1點:

      char argOne = argv[1]; 

    是非常錯誤的。 您不能將const char * (指針)放入char變量。

  • 第2點:

      case '1234' 

    也錯了。 這里, '1234' 表示字符串。 它是一個多字節的charcater,很可能是你不想要的東西。 同樣,即使你將其改為類似"1234"東西,它仍然是不正確的 ,因為它不會給你預期的值,並且字符串不能用於case語句

解決方案:您可以嘗試使用strcmp()來比較傳入的字符串並相應地選擇,而不是在此處使用switch case。


注意: main()的推薦簽名是int main(int argc, char *argv[])

你在char (字符)和char * (字符串)之間混淆了。 此外,您不能使用字符串作為開關/案例標簽。 以下是您的代碼的固定版本:

#include <stdio.h>

int main(int argc, const char *argv[]) {

    const char *argOne = argv[1];
    const char *argTwo = argv[2];

    if (strcmp(argOne, "1234) == 0)
    {
        printf("1234!\n");
    }
    else
    {
        printf("Invalid\n");
    }        
    return 0;
}

首先是主要的標准聲明看起來像

int main(int argc, char *argv[])
                   ^^^^^^

那是第二個參數沒有限定符const

其次argv [1]的類型為char * 將它與類似於'1234'字符文字進行比較是沒有任何意義'1234' 至於字符串文字"1234" ,它可能不在案例標簽中使用。

你想要的是以下內容

#include <stdio.h>
#include <string.h>

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

    if ( argc > 2 )
    { 
        char *argOne = argv[1];
        char *argTwo = argv[2];

        if ( strcmp( argOne, "1234" ) == 0 )
        {
            puts( "1234!" );
        }
        else
        {
            puts( "Invalid" );
        }
    }
}

你不能(真的)將指向char的指針“轉換”為單個char 但是,您可以從字符串中提取一個單個字符。

例如,要獲取程序的第一個參數的第一個字符,您可以執行以下操作:

char first_char_of_first_arg = 0;
if (argv > 1)
    first_char_of_first_arg = argv[1][0];

代碼包含幾個問題

在啟用所有警告的情況下進行編譯將允許編譯器顯示這些問題。

對於gcc,至少使用:'-Wall -Wextra -pedantic'

注意:警告需要修復,因為編譯器比你或我更了解C語言。

#include <stdio.h>

int main(int argc, const char *argv[])
{
    //<< parameter argc not used
    //   and it should be used to assure that argv[1] and argv[2] actually exist

    char argOne = argv[1];
    //<< argv[1] is a pointer to a character string.
    //   argOne is a single char
    //   it should be: 'char argOne = argv[0][0];'

    char argTwo = argv[2];
    //<< argv[2] is a pointer to a character string.
    //   argTwo is a single character
    //   it should be: 'char argTwo = argv[1][0];'
    //<< argTwo is not used

    switch(argOne)
    //<< a character can be treated as an int, but due care needs to be exercised
    {
        case '1234' :
        //<< a case statement can only look at an 'int',
        //   not a pointer to a (in this case unterminated) string
        //   and argOne is a single char, not a pointer to a unterminated string
            printf("1234!\n" );
            break;
        default :
        printf("Invalid\n" );
        //<< for human readability, use consistent indentation
        //   and never use tabs for indenting
        //<< every case should be terminated with 'break;'
        //   unless the case is to fall through to the next case
        //   I.E. just because a syntax 'can' be used does not mean it 'should' be used
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM