Cession rend pointeur d'entier sans cast
Venant de Java fond je suis en train d'apprendre le C, mais je trouve ces vagues messages d'erreur du compilateur de plus en plus frustrant. Voici mon code:
/*
* PURPOSE
* Do case-insensetive string comparison.
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int compareString(char cString1[], char cString2[]);
char strToLower(char cString[]);
int main() {
//Declarations
char cString1[50], cString2[50];
int isEqual;
//Input
puts("Enter string 1: ");
gets(cString1);
puts("Enter string 2: ");
gets(cString2);
//Call
isEqual = compareString(cString1, cString2);
if (isEqual == 0)
printf("Equal!\n");
else
printf("Not equal!\n");
return 0;
}
//WATCH OUT
// This method *will* modify its input arrays.
int compareString(char cString1[], char cString2[]) {
//To lowercase
cString1 = strToLower(cString1);
cString2 = strToLower(cString2);
//Do regular strcmp
return strcmp(cString1, cString2);
}
//WATCH OUT
// This method *will* modify its input arrays.
char strToLower(char cString[]) {
//Declarations
int iTeller;
for (iTeller = 0; cString[iTeller] != '/*
* PURPOSE
* Do case-insensetive string comparison.
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int compareString(char cString1[], char cString2[]);
char strToLower(char cString[]);
int main() {
//Declarations
char cString1[50], cString2[50];
int isEqual;
//Input
puts("Enter string 1: ");
gets(cString1);
puts("Enter string 2: ");
gets(cString2);
//Call
isEqual = compareString(cString1, cString2);
if (isEqual == 0)
printf("Equal!\n");
else
printf("Not equal!\n");
return 0;
}
//WATCH OUT
// This method *will* modify its input arrays.
int compareString(char cString1[], char cString2[]) {
//To lowercase
cString1 = strToLower(cString1);
cString2 = strToLower(cString2);
//Do regular strcmp
return strcmp(cString1, cString2);
}
//WATCH OUT
// This method *will* modify its input arrays.
char strToLower(char cString[]) {
//Declarations
int iTeller;
for (iTeller = 0; cString[iTeller] != '\0'; iTeller++)
cString[iTeller] = (char)tolower(cString[iTeller]);
return cString;
}
'; iTeller++)
cString[iTeller] = (char)tolower(cString[iTeller]);
return cString;
}
Cela génère deux avertissements.
- cession rend pointeur d'entier sans un casting
- cString1 = strToLower(cString1);
- cString2 = strToLower(cString2);
- retour rend entier de pointeur sans un casting
- retour cString;
Quelqu'un peut m'expliquer ces avertissements?
Vous devez vous connecter pour publier un commentaire.
C les chaînes ne sont pas n'importe quoi comme des cordes de Java. Ils sont essentiellement des tableaux de caractères.
Vous obtenez l'erreur, car strToLower retourne un char. Un char est une forme de nombre entier dans C. de l'affectation dans un char[] qui est un pointeur. C'est pourquoi, "la conversion d'entier en pointeur".
Votre strToLower fait tous ses changements, il n'y a aucune raison pour qu'il retourne rien, et surtout pas un char. Vous devez "retour" ou nulle, ou un char*.
Sur l'appel à strToLower, il n'est pas nécessaire de prévoir une affectation, vous êtes essentiellement simplement en passant l'adresse de mémoire pour cString1.
Dans mon expérience, les Chaînes de caractères en C sont la partie la plus difficile à apprendre pour ceux qui viennent de Java/C# arrière-plan de retour à C. les Gens peuvent vivre avec une allocation de mémoire (car même en Java, vous avez souvent allouer des tableaux). Si votre objectif final est le C++ et pas en C, vous préférez peut-être moins se concentrer sur les chaînes C, assurez-vous que vous comprenez les bases, et il suffit d'utiliser la chaîne C++ à partir de la STL.
strToLower type de retour doit être
char*
paschar
(ou alors, il faut retourner à rien du tout, puisqu'il n'a pas ré-allouer de la chaîne)
Comme d'autres l'a déjà noté, dans un cas, vous êtes en train d'essayer de revenir
cString
(qui est unchar *
de valeur dans ce contexte - un pointeur) à partir d'une fonction qui est déclarée pour retourner unchar
(qui est un entier). Dans un autre cas, vous faire l'inverse: l'affectation d'unchar
valeur de retour d'unechar *
pointeur. C'est ce qui déclenche les avertissements. Vous avez certainement besoin de déclarer votre retour à des valeurs commechar *
, pas commechar
.Remarque d'AILLEUR que ces missions sont en fait les violations de contrainte de la langue du point de vue (c'est à dire qu'ils sont des "erreurs"), comme il est illégal de pointeurs de mix et les nombres entiers en C comme ça (à part intégrante de la constante de zéro). Votre compilateur est tout simplement trop indulgent à cet égard et les rapports de ces violations comme de simples "mises en garde".
Ce que je tenais également à souligner est que, dans plusieurs réponses, vous remarquerez peut-être relativement étrange suggestion pour revenir
void
de vos fonctions, puisque vous êtes à la modification de la chaîne en place. Alors qu'il va certainement travailler (puisque vous êtes modification de la chaîne en place), il n'y a rien de vraiment faux avec le retour de la même valeur de la fonction. En fait, c'est plutôt une pratique courante dans le langage C, le cas échéant, de prendre un regard sur les fonctions standard telles que lestrcpy
et autres), car elle permet de "chaînage" des appels de fonction si vous choisissez de l'utiliser, et les frais pratiquement rien si vous n'utilisez pas de "chaînage".Cela dit, les missions de la mise en œuvre de
compareString
look complet superflu pour moi (même si elles ne cassent rien). J'avais soit se débarrasser d'euxou utilisez le "chaînage" et ne
(c'est quand votre
char *
retour viendrait à portée de main). Il suffit de garder à l'esprit que de telles "enchaînés" les appels de fonction sont parfois difficiles à déboguer avec une étape-par-étape du débogueur.Comme un supplément, unrealted remarque, je dirais que la mise en œuvre d'une fonction de comparaison de chaînes de caractères dans un destructeur de la mode (il modifie la saisie de chaînes de caractères) peut ne pas être la meilleure idée. Non-destructive, la fonction serait d'une plus grande valeur à mon avis. Au lieu de faire comme la conversion explicite de l'entrée des chaînes à une baisse des cas, il est généralement préférable de mettre en œuvre une coutume char par char de la casse de la chaîne de fonction de comparaison et de l'utiliser au lieu d'appeler le standard
strcmp
.1) Ne pas utiliser
gets
! Vous êtes l'introduction d'un dépassement de capacité de la vulnérabilité. Utilisationfgets(..., stdin)
à la place.2) Dans
strToLower
vous êtes de retour d'unechar
au lieu d'unchar
-tableau. Retourchar*
comme Autopulated suggéré, ou juste retourvoid
puisque vous êtes à la modification de l'entrée, de toute façon. Comme un résultat, il suffit d'écrirestrcasecmp
(Linux & Mac) oustricmp
(Windows).Vous n'avez pas besoin de ces deux assignations:
vous modifiez les cordes en place.
Avertissements sont parce que vous êtes de retour d'un char, et l'affectation à un char[] (ce qui est équivalent à char*)
Vous êtes de retour char, et pas char*, qui est le pointeur sur le premier caractère d'un tableau.
Si vous souhaitez retourner un nouveau tableau de caractères au lieu de le faire en place, la modification, vous pouvez demander à un déjà alloué pointeur (char*) comme paramètre, ou un pointeur non initialisé. Dans ce dernier cas, vous devez allouer le bon nombre de caractères pour la nouvelle chaîne et n'oubliez pas que dans C paramètres passés par valeur TOUJOURS, donc vous devez utiliser des char** en tant que paramètre dans le cas de tableau alloué à l'interne par la fonction. Bien sûr, l'appelant doit gratuitement ce pointeur plus tard.
strToLower doit retourner un char *, au lieu d'un char. Quelque chose comme ce serait le faire.
C'est un tableau, c'est à dire un pointeur vers le premier élément d'une série d'éléments du même type de données. Remarque vous n'êtes pas du passage du tableau par valeur, mais par pointeur.
Cependant, il renvoie un char. Si votre affectation
dispose de différents types de chaque côté de l'opérateur d'affectation .. vous êtes en fait l'attribution d'un 'char' (sorte de entier) à un tableau, qui correspond à un simple pointeur. En raison de C++implicite des règles de conversion, cela fonctionne, mais le résultat est des déchets et l'accès au tableau provoque un comportement indéterminé.
La solution est de faire
strToLower
retourchar*
.