c语言 - 错误:"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");
}
}
}

char类型的对象的大小始终等于1。因此,在程序中声明的此类对象名为word

char word;

不能包含字符串。字符串具有字符数组的类型。

而且这个scanf的呼唤

scanf("%d",&word);

由于对类型为char的对象使用了不正确的转换说明符%d,因此没有意义并调用未定义的行为。

您需要声明一个字符数组来输入字符串,例如

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"};

要比较两个字符串,您需要使用在标头<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 %zun", i );
}
else
{
puts( "Keyword Not Found" );
}

return 0;
}

例如,如果要输入字符串"continue"则程序输出为

Keyword Found at Position 2

C 中的字符串是char的数组,应该指定它们的最大长度。因此,字符串变量的声明应如下所示。我假设长度为 9 的字符串加上空字符.

char word[10];  // string with 9 characters plus termination character 
char arr[7][10] = {"break", "case", "continue", "default", "else", "defer", "for"};  // array with 7 strings of size 10 (9 chars plus )

此外,应使用string.hlib 中的strcmp函数而不是==来比较字符串。后者仅比较字符串的内存地址,而strcmp比较每个字符串的字符。

进一步阅读有关 C 字符串的信息:https://www.tutorialspoint.com/cprogramming/c_strings.htm

char arr[7]={"break", "case", "continue", "default", "else", "defer", "for"};

您的 arr 是一个字符数组,而不是字符串数组。您可以使用结构概念制作字符串数组。喜欢这个

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:"继续"。请注意,此数字是单词的 8 个字母,1 表示空终止符 ()。 初始化arr的另一种方法是:

char *arr[7] = { /* ... */ };

在本例中,arr包含 7 个指向 7 个字符串(存在于内存中的其他位置)的char指针。

以下是您的完整程序,其中包含逐行更正和建议:

#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 Foundn");     // Add newline character for nicer output
}
else{
printf("Keyword Not Foundn"); // Add newline character for nicer output
}
}
}

请注意,为了使它工作,word的类型也更改了scanf参数和字符串比较。==比较两个指针(指向两个字符串)是否相等(换句话说,两个指针指向同一位置),但不比较两个字符串的内容。有关更多信息,请参阅此处strcmp。请注意,如果字符串相同,它将返回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 Foundn");
else
printf("Keyword Not Foundn");
}

这里的错误比行多:

  1. char arr[7]==>char *arr[7]=
  2. 要比较字符串,您需要使用strcmp函数
  3. 如果要scanf字符串,请使用%s格式说明符。
  4. 要存储字符串,您需要char数组:

而不是

char word;
scanf("%d",&word);

char word[10];
scanf("%9s",word);

相关内容

  • 没有找到相关文章

最新更新