Error: "Excess elements in char array initializer"
Error: "Excess elements in char array initializer"
如您所见,我正在尝试检查用户输入的元素是否存在于我的数组中。但是在声明和定义arr
的那一行出现如下错误:
1)[Error] excess elements in char array initializer
2)[Error] (near initialization for 'arr')
这是我的代码:
#include <stdio.h>
int main(){
char word;
scanf("%d",&word);
char arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
int i,n=7;
for(i=0;i<n;i++){
if(word==arr[i]){
printf("Keyword Found");
}
else{
printf("Keyword Not Found");
}
}
}
C 中的字符串是char
的数组,应指定其最大长度。因此,您的字符串变量的声明应如下所示。我假设字符串长度为 9 加上空字符 [=12=]
.
char word[10]; // string with 9 characters plus termination character [=10=]
char arr[7][10] = {"break", "case", "continue", "default", "else", "defer", "for"}; // array with 7 strings of size 10 (9 chars plus [=10=])
此外,应该使用 string.h
库中的 strcmp
函数而不是 ==
来比较字符串。后者只比较字符串的内存地址,而strcmp
比较每个字符串的字符。
进一步阅读 C 字符串:https://www.tutorialspoint.com/cprogramming/c_strings.htm
char arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
你的 arr 是一个字符数组而不是字符串数组。您可以使用 structure.Like this,
的概念创建一个字符串数组
char arr[10];
struct arr_str{
char arr[10];
};
int main(){
struct arr_str array[7]; // array of strings.
return 0;
}
或者你也可以简单地制作一个二维字符数组(数组的数组)。
char arr[7][10];
变量arr
是一个char
的数组,但初始化列表由一个字符串文字数组组成。字符串文字可用于初始化 char
的数组,但这不是 arr
的数组,因此编译器会产生有关 excess elements
的错误。这些语句是有效的,因为初始值设定项包含单个字符串文字:
char arr[6] = { "break" };
或者更确切地说
char arr[6] = "break";
将 arr
更改为 char
数组的数组,代码将编译:
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
这是 7 个元素,其中最长的元素的长度为 9:“continue”。请注意,此数字是单词的 8 个字母,空终止符为 1 ([=23=]
)。
另一种初始化 arr
的方法是这样的:
char *arr[7] = { /* ... */ };
在这种情况下,arr
包含 7 个 char
指向 7 个字符串的指针(它们存在于内存中的其他地方)。
这是包含逐行更正和建议的完整程序:
#include <stdio.h> // Add stdio header for scanf and printf
#include <string.h> // Add string header for strcmp
int main(void){ // Add "void" for a correct main signature
char word[64]; // Needs to be a character array, not a single character
scanf("%64s", word); // Needs to read a string of max 64 characters, not an integer
// Next line needs to be a 2D array: it is an array of character arrays
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
int n=7; // Declare variables on separate lines
for(int i=0;i<n;i++){ // Declare/define i within the for-loop to reduce its scope
if(!strcmp(word, arr[i])){ // Replace == by strcmp
printf("Keyword Found\n"); // Add newline character for nicer output
}
else{
printf("Keyword Not Found\n"); // Add newline character for nicer output
}
}
}
请注意,为了使其正常工作,还更改了 word
的类型、scanf
的参数和字符串比较。 ==
比较两个指针(指向两个字符串)是否相等(换句话说,两个指针指向相同的位置),但不比较两个字符串的内容。有关详细信息,请参阅 here strcmp
。请注意,如果字符串相同,则 returns 0
。
下一步可能是扫描关键字列表以检测是否找到匹配项,最后只打印一个“找到/未找到”语句。这可以通过使用布尔值来完成:
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
int main(void){
char word[64];
scanf("%64s", word);
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
int n=7;
bool keywordFound = false;
for(int i=0;i<n;i++){
if(!strcmp(word, arr[i])){
keywordFound = true;
break;
}
}
if (keywordFound)
printf("Keyword Found\n");
else
printf("Keyword Not Found\n");
}
char
类型的 object 的大小始终等于 1
。所以在程序中声明的 object 名称为 word
char word;
不能包含字符串。字符串有字符数组类型。
此外scanf
的这个调用
scanf("%d",&word);
没有意义并调用未定义的行为,因为使用了不正确的转换说明符 %d
和 char
.
类型的 object
你需要声明一个字符数组来输入一个字符串,例如
char word[10];
并像
一样调用scanf
scanf("%9s", word);
数组声明也不正确。该数组不包含 7 个字符。它的初始值设定项是具有字符数组类型的字符串文字。
你应该写
char * arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
甚至写成
更好
const char * arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
要比较两个字符串,您需要使用在 header <string.h>
中声明的标准字符串函数 strcmp
例如
if ( strcmp( word, arr[i] ) == 0 )
{
// two strings are equal each other
}
else
{
// two strings are unequal
}
同样输出消息也没有意义
printf("Keyword Not Found");
对于数组中的每个不相等的字符串。
循环至少可以改写成下面的方式
int i = 0, n = 7;
while ( i < n && strcmp( word, arr[i] ) != 0 ) i++;
if ( i != n )
{
printf("Keyword Found");
}
else
{
printf("Keyword Not Found");
}
这是一个演示程序
#include <stdio.h>
#include <string.h>
int main(void)
{
const char * arr[] =
{
"break", "case", "continue", "default", "else", "defer", "for"
};
const size_t N = sizeof( arr ) / sizeof( *arr );
char word[10] = "";
scanf( "%9s", word );
size_t i = 0;
while ( i < N && strcmp( word, arr[i] ) != 0 ) i++;
if ( i != N )
{
printf( "Keyword Found at Position %zu\n", i );
}
else
{
puts( "Keyword Not Found" );
}
return 0;
}
如果输入例如字符串 "continue"
那么程序输出是
Keyword Found at Position 2
你的错误比这里的行数还多:
而不是
char word;
scanf("%d",&word);
做
char word[10];
scanf("%9s",word);
如您所见,我正在尝试检查用户输入的元素是否存在于我的数组中。但是在声明和定义arr
的那一行出现如下错误:
1)[Error] excess elements in char array initializer
2)[Error] (near initialization for 'arr')
这是我的代码:
#include <stdio.h>
int main(){
char word;
scanf("%d",&word);
char arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
int i,n=7;
for(i=0;i<n;i++){
if(word==arr[i]){
printf("Keyword Found");
}
else{
printf("Keyword Not Found");
}
}
}
C 中的字符串是char
的数组,应指定其最大长度。因此,您的字符串变量的声明应如下所示。我假设字符串长度为 9 加上空字符 [=12=]
.
char word[10]; // string with 9 characters plus termination character [=10=]
char arr[7][10] = {"break", "case", "continue", "default", "else", "defer", "for"}; // array with 7 strings of size 10 (9 chars plus [=10=])
此外,应该使用 string.h
库中的 strcmp
函数而不是 ==
来比较字符串。后者只比较字符串的内存地址,而strcmp
比较每个字符串的字符。
进一步阅读 C 字符串:https://www.tutorialspoint.com/cprogramming/c_strings.htm
char arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
你的 arr 是一个字符数组而不是字符串数组。您可以使用 structure.Like this,
的概念创建一个字符串数组char arr[10];
struct arr_str{
char arr[10];
};
int main(){
struct arr_str array[7]; // array of strings.
return 0;
}
或者你也可以简单地制作一个二维字符数组(数组的数组)。
char arr[7][10];
变量arr
是一个char
的数组,但初始化列表由一个字符串文字数组组成。字符串文字可用于初始化 char
的数组,但这不是 arr
的数组,因此编译器会产生有关 excess elements
的错误。这些语句是有效的,因为初始值设定项包含单个字符串文字:
char arr[6] = { "break" };
或者更确切地说
char arr[6] = "break";
将 arr
更改为 char
数组的数组,代码将编译:
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
这是 7 个元素,其中最长的元素的长度为 9:“continue”。请注意,此数字是单词的 8 个字母,空终止符为 1 ([=23=]
)。
另一种初始化 arr
的方法是这样的:
char *arr[7] = { /* ... */ };
在这种情况下,arr
包含 7 个 char
指向 7 个字符串的指针(它们存在于内存中的其他地方)。
这是包含逐行更正和建议的完整程序:
#include <stdio.h> // Add stdio header for scanf and printf
#include <string.h> // Add string header for strcmp
int main(void){ // Add "void" for a correct main signature
char word[64]; // Needs to be a character array, not a single character
scanf("%64s", word); // Needs to read a string of max 64 characters, not an integer
// Next line needs to be a 2D array: it is an array of character arrays
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
int n=7; // Declare variables on separate lines
for(int i=0;i<n;i++){ // Declare/define i within the for-loop to reduce its scope
if(!strcmp(word, arr[i])){ // Replace == by strcmp
printf("Keyword Found\n"); // Add newline character for nicer output
}
else{
printf("Keyword Not Found\n"); // Add newline character for nicer output
}
}
}
请注意,为了使其正常工作,还更改了 word
的类型、scanf
的参数和字符串比较。 ==
比较两个指针(指向两个字符串)是否相等(换句话说,两个指针指向相同的位置),但不比较两个字符串的内容。有关详细信息,请参阅 here strcmp
。请注意,如果字符串相同,则 returns 0
。
下一步可能是扫描关键字列表以检测是否找到匹配项,最后只打印一个“找到/未找到”语句。这可以通过使用布尔值来完成:
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
int main(void){
char word[64];
scanf("%64s", word);
char arr[7][9]={"break", "case", "continue", "default", "else", "defer", "for"};
int n=7;
bool keywordFound = false;
for(int i=0;i<n;i++){
if(!strcmp(word, arr[i])){
keywordFound = true;
break;
}
}
if (keywordFound)
printf("Keyword Found\n");
else
printf("Keyword Not Found\n");
}
char
类型的 object 的大小始终等于 1
。所以在程序中声明的 object 名称为 word
char word;
不能包含字符串。字符串有字符数组类型。
此外scanf
scanf("%d",&word);
没有意义并调用未定义的行为,因为使用了不正确的转换说明符 %d
和 char
.
你需要声明一个字符数组来输入一个字符串,例如
char word[10];
并像
一样调用scanf
scanf("%9s", word);
数组声明也不正确。该数组不包含 7 个字符。它的初始值设定项是具有字符数组类型的字符串文字。
你应该写
char * arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
甚至写成
更好const char * arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};
要比较两个字符串,您需要使用在 header <string.h>
中声明的标准字符串函数 strcmp
例如
if ( strcmp( word, arr[i] ) == 0 )
{
// two strings are equal each other
}
else
{
// two strings are unequal
}
同样输出消息也没有意义
printf("Keyword Not Found");
对于数组中的每个不相等的字符串。
循环至少可以改写成下面的方式
int i = 0, n = 7;
while ( i < n && strcmp( word, arr[i] ) != 0 ) i++;
if ( i != n )
{
printf("Keyword Found");
}
else
{
printf("Keyword Not Found");
}
这是一个演示程序
#include <stdio.h>
#include <string.h>
int main(void)
{
const char * arr[] =
{
"break", "case", "continue", "default", "else", "defer", "for"
};
const size_t N = sizeof( arr ) / sizeof( *arr );
char word[10] = "";
scanf( "%9s", word );
size_t i = 0;
while ( i < N && strcmp( word, arr[i] ) != 0 ) i++;
if ( i != N )
{
printf( "Keyword Found at Position %zu\n", i );
}
else
{
puts( "Keyword Not Found" );
}
return 0;
}
如果输入例如字符串 "continue"
那么程序输出是
Keyword Found at Position 2
你的错误比这里的行数还多:
而不是
char word;
scanf("%d",&word);
做
char word[10];
scanf("%9s",word);