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);

没有意义并调用未定义的行为,因为使用了不正确的转换说明符 %dchar.

类型的 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

你的错误比这里的行数还多:

  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);