比较通过char-pointers传递给函数的字符串

时间:2015-04-14 14:37:42

标签: c function pointers

我需要帮助来比较使用指针的函数上的两个字符串,我知道如何在不使用指针的情况下执行此操作。

以下是代码:

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

char *randString(int dif);
void compare(char *ptr, char *palabra[10]);
int main (){
    srand(time(NULL));

    int contador = 0;
    int dif;
    char *palabra[10];
    /*while (  contador < 100 ){
        char* ptr = randString();
        printf ( "%s\n", ptr );

        contador++;
    }*/
    printf("Dificultad: ");
    scanf("%i",&dif);
    char *ptr=randString(dif);
    printf("Palabra seleccionada: %s\n",ptr);

    printf("Introduce palabra para comparar: ");
    scanf("%s",palabra);

    compare( ptr, palabra );

    getchar();
    return 0;
}

static char difone[5][100] ={
    {"Duck"},
    {"Taxi"},
    {"Hola Mundo!"},
    {"Paris"},
    {"Lexugon"}
};
static char diftwo[5][100] ={
    {"colan"},
    {"cocuy"},
    {"cojee"},
    {"clona"},
    {"cobra"}
};
static char difthree[5][100] ={
    {"cogen"},
    {"codee"},
    {"cocio"},
    {"cogio"},
    {"coces"}
};

char *randString(int dif) {
    if(dif==1){
        return difone[rand() % ( 4 - 0 )] ;
    }else{
        if(dif==2){
            return diftwo[rand() % ( 4 - 0 )] ;
        }else{
            if(dif==3){
                return difthree[rand() % ( 4 - 0 )] ;
            }
        }
    }
}

这是比较功能:

void compare(char* ptr, char *palabra[10]){
    printf("Palabra seleccionada: %s\n",ptr);
    printf("Palabra introducida: %s",palabra);

    if(strcmp((*ptr)[1],(*palabra)[1]==0){
        printf("Igual");
    }else{
        printf("No igual");
    }

}

1 个答案:

答案 0 :(得分:1)

所以,有几个问题:

首先,您将palabra声明为指向char 的指针数组,根据代码,这不是您想要的:

  scanf("%s",palabra);

如果您希望palabra存储一个不超过9个字符的字符串,只需将其声明为

char palabra[10];

这意味着您还需要更改compare函数的声明和定义,如下所示:

void compare( char *ptr, char *palabra )

接下来,将strcmp功能中的compare来电更改为

if( strcmp( ptr, palabra ) ==0 ){

表达式(*ptr)[1]尝试取消引用ptr,然后将下标应用于结果,在这种情况下,将起作用。 *ptr的结果是字符串ptr中指向的第一个字符的值(difonediftwodifthree中的一个字符串阵列)。单个字符不是数组或指针表达式,因此您无法将[]运算符应用于它。

除非它是sizeof或一元&运算符的操作数,否则像palabra这样的数组表达式将被转换(“衰减”)为指针表达式,值指针的名称将是数组的第一个元素的地址。我们在palabra中将char声明为main的10个元素数组,但是当我们将其作为参数传递给scanfcompare时,该数组表达式转换为指针表达式,这就是我们在char *palabra的定义中将其声明为compare的原因。