我刚学习数组。所以我尝试编写一个简单的练习,其中函数应该检查给定的参数(或更多)是否在定义的数组中。 像这样:./ main a - >列表y
int main( int argc, char* argv[] ){
int i,n;
char a[]={'a','5ab','na','8s'};
for(i = 1; i < (argc); ++i){
while (n < 4){
if (argv[i] == a[n]){
printf("y");
break;
}
}
}
return 0;
}
Runnung这个,我收到警告:&#34;溢出隐式恒定转换&#34;和&#34;多字符字符常量[-Wmultichar]&#34; 好吧,我认为它与argv [i] == a [n]有关。我怎么能纠正这个?
答案 0 :(得分:3)
在C中,有两种与文本相关的数据类型:char
和字符串。字符串是指向字符数组的指针,按照惯例,它以NUL字符终止(&#39; \ 0&#39;)。 char
是表示ASCII字符的单个字节。
您可以通过编辑打开和关闭双引号之间包含的一系列字符来创建字符串文字:"this is a string literal"
另一方面,您通过在一对单引号之间编译单个字符表达式(可能带有反斜杠转义)来创建char
字面值:&#39; t&# 39;,&#39; h&#39;,&#39; e&#39;&#39; s&#39;,&#39; e&#39;,&#39; &#39;,&#39; a&#39;,&#39; r&#39;,&#39; e&#39;,&#39; &#39;,&#39; c&#39;,&#39; h&#39;,&#39; a&#39;,&#39; r&#39;,&#39; &#39;,&#39; l&#39;,&#39;我&#39;,&#39;&#39;,&#39; e&#39;,&#39; r&#39;, &#39; a&#39;,&#39; l&#39;&#39;&#39;&#39; \ n&#39;
在代码页和多字节字符编码出现后,C添加(勉强)支持&#34;宽字符&#34; (即,用于存储单个元素的超过8位)和用于&#34;多字节字符&#34; (即使用8位值但需要多个编码单个字形的字符编码)。
编译器看到你的行正在初始化数组:
char a[]={'a','5ab','na','8s'};
并假设&#39; 5ab&#39;和&#39; na&#39;和&#39; 8s&#39;是您尝试指定宽字节或多字节字符文字。 知道字符(不是字符串)用单引号括起来。它知道您正在使用类型char
。所以这些不是字符串。但它们也不是多字节字符。
实际上,我认为你的意思是他们是弦乐。你可能来自python,bash,或perl或其他一些单引号可以分隔字符串的语言。但那不是C.
要创建字符串列表,您需要知道字符串的类型为char *
(或const char *
)。然后,您想要创建一个数组 - 这是您的列表:
const char *list_of_str[] = {
"hello",
"my name",
"is George"
};
您会注意到argv
是一个字符串列表。 ; - )
答案 1 :(得分:0)
你的a []数组中不能有'5ab'。字符数组只能包含单个字符,例如“a”,“5”或“\ n”。
另外,我不确定对我来说是不是一个好主意。 (argc)在你的for循环中。 argc是运行C程序时传入的元素数。试试我&lt; 4并确保for循环中的i从0开始。
答案 2 :(得分:0)
在字符数组中,每个内存空间是一个代表一个字符的字节。尝试使用字符串而不是字符。 char a [] = {'a','5ab','na','8s'};
答案 3 :(得分:0)
数组仅为一种类型,在您的情况下为char
。
您的while
循环也不正确(可能是无限的)。什么是n
的价值?什么是休息条件?
n
的值