程序崩溃与字符串和数组

时间:2014-02-10 04:45:56

标签: c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){

int n, i, check=0;
char first_name[20];
char current_name[20];

printf("Enter n, followed by n last names (each last name must be a single word):");
scanf("%d", &n);
scanf("%s", &first_name[20]);

for (i=1; i<n; i++){
    scanf("%s", &current_name[20]);
    if ( strcmp(first_name[20], current_name[20])==0)
        check = 1;
}
    if (check == 1)
    printf("First name in list is repeated.");
else
    printf("First name in list is not repeated.");
system("pause");

return 0;
}

我正在使用Dev C ++,我得到的错误是:

23:9 [警告]传递'strcmp'的参数1使整数指针没有强制转换[默认情况下启用]

程序运行,但在我输入几个名字后崩溃了。

4 个答案:

答案 0 :(得分:2)

strcmp(first_name[20], current_name[20])==0)

对于

而言,使用strcmp(first_name,current_name)也是无效的

scanf("%s", &first_name[20]);改为使用scanf("%s",first_name)

答案 1 :(得分:0)

您没有正确使用strcmp()。将char []传递给函数时,只需使用其名称即可。

所以你需要解决以下问题:

  1. 更改

    if ( strcmp(first_name[20], current_name[20])==0)
    

    if ( strcmp(first_name, current_name) )
    
  2. 更改

    scanf("%s", &first_name[20]);
    ...
    scanf("%s", &current_name[20]);
    

    scanf("%s", first_name);
    ...
    scanf("%s", current_name);
    

答案 2 :(得分:0)

如果您只想使用一个字符串,这里的其他答案将有所帮助。如果您想要使用字符串数组,就像您在循环中打印的输出一样,那么您应该声明一个字符串数组而不是单个字符串。

char first_name[20];

声明一个chars数组(如果这些字符中的任何一个是NUL,则为单个字符串)。您似乎想要使用字符串数组,因此您需要一个二维数组的字符(或每个字符串的char指针和malloc数组):

char first_name[20][MAX_NAME_LENGTH];

其中MAX_NAME_LENGTH定义如上:

#define MAX_NAME_LENGTH 64

然后你就能做到这样的事情:

strcmp(first_name[i], current_name[i])

由于first_name[i]会衰减为char *

答案 3 :(得分:0)

在c / c ++中,字符串只是一个char数组。 要访问数组元素,请使用指针。要从头开始访问字符串,您必须提供指向字符串开头的指针。

Strcmp和scanf将指针指向char数组(因此,字符串):

int strcmp ( const char * str1, const char * str2 );
int scanf ( const char * format, ... );

他们需要指向字符串开头的指针。你可以写:

scanf("%s", first_name);
strcmp(first_name, current_name) == 0

scanf("%s", &first_name[0]);
strcmp(&first_name[0], &current_name[0]) == 0