[英]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.