错误:“char数组初始值设定项中的元素过多”

oxcyiej7  于 2023-05-16  发布在  其他
关注(0)|答案(5)|浏览(264)

正如您所看到的,我正在尝试检查用户输入的元素是否存在于数组中。但是在声明和定义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");
        }
    }
}
piwo6bdm

piwo6bdm1#

类型为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 %zu\n", i );
    }
    else
    {
        puts( "Keyword Not Found" );
    }
        
    return 0;
}

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

Keyword Found at Position 2
a11xaf1n

a11xaf1n2#

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

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

此外,字符串应该使用string.h库中的strcmp函数进行比较,而不是==。后者只比较字符串的内存地址,而strcmp比较每个字符串的字符。
进一步阅读C字符串:https://www.tutorialspoint.com/cprogramming/c_strings.htm

e37o9pze

e37o9pze3#

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];
fv2wmkja

fv2wmkja4#

变量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表示空终止符(\0)。另一种初始化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。请注意,如果字符串相同,则返回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");
}
ruyhziif

ruyhziif5#

这里的错误比行数还多:

  1. char arr[7]= => char *arr[7]=
    1.要比较字符串,需要使用strcmp函数
    1.如果你想scanf字符串使用%s说明符。
    1.要存储字符串,您需要char数组:
    而不是
char word;
scanf("%d",&word);

做了

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

相关问题