Comment puis-je copier le contenu de argv[] dans un style c string?
Je suis en train d'écrire un programme qui prend plusieurs arguments lors de l'exécution pour ajouter du texte dans un fichier.
Le programme produit une erreur de segmentation lors de l'exécution. Voici le code:
int main(int argc, char* argv[])
{
//error checking
if (argc < 1 || argc > 4) {
cout << "Usage: -c(optional - clear file contents) <Filename>, message to write" << endl;
exit(EXIT_FAILURE);
}
char* filename[64];
char* message[256];
//set variables to command arguments depending if -c option is specificed
if (argc == 4) {
strcpy(*filename, argv[2]);
strcpy(*message, argv[3]);
} else {
strcpy(*filename, argv[1]);
strcpy(*message, argv[2]);
}
int fd; //file descriptor
fd = open(*filename, O_RDWR | O_CREAT, 00000); //open file if it doesn't exist then create one
fchmod(fd, 00000);
return 0;
}
Je suis encore assez débutant et je vais avoir l'immense difficulté à comprendre c des chaînes de caractères. Quelle est la différence entre char* et char[] et char* []?
Mise à JOUR:
Le code en jette toujours une erreur de segmentation, voici mon nouveau code:
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
//error checking
if (argc < 1 || argc > 4) {
cout << "Usage: -c(optional - clear file contents) <Filename>, message to write" << endl;
exit(EXIT_FAILURE);
}
char filename[64];
char message[256];
//set variables to command arguments depending if -c option is specificed
if (argc == 4)
{
strncpy(filename, argv[2], 64);
strncpy(message, argv[3], 256);
}
else
{
strncpy(filename, argv[1], 64);
strncpy(message, argv[2], 256);
}
int fd; //file descriptor
fd = open(filename, O_RDWR | O_CREAT, 00000); //open file if it doesn't exist then create one
fchmod(fd, 00000);
return 0;
}
Vous obtenez des points pour la fourniture d'une tentative au programme; beaucoup de choses à apprendre, mais vous étiez proche.
OriginalL'auteur Scholar | 2013-10-05
Vous devez vous connecter pour publier un commentaire.
char* filename[64]
crée un tableau de 64 pointeurs. Vous avez l'intention de créer de l'espace pour une chaîne de 64 caractères - ce seraitchar filename[64]
. Parce que vous n'alloue de l'espace pour les pointeurs, et n'a jamais fait les pointeurs point de la mémoire, vous obtenez un seg fault.Solution: utiliser
char filename[64];
Cela crée un bloc de 64 octets pour votre chaîne; la valeur
filename
points au début de ce bloc et peut être utilisé dans une opération de copieJe vous recommande fortement de l'aide de la "copie pas plus de n caractères" fonction - ce qui empêche un bon argument de provoquer un dépassement de mémoire tampon. Ainsi
serait plus sûr. Encore mieux
Cela garantit que la chaîne de caractères copiée est une valeur null.
Vous avez le même problème avec
message
. Je ne pense pas que vous avez besoin du code de répéter...Laissez-moi savoir si vous avez besoin de plus d'infos.
Mise à JOUR
Aujourd'hui, j'ai appris l'existence de
strlcpy
- voir cette réponse. Il prendra soin de laNUL
terminateur de chaîne, même lorsque la première chaîne est plus longue que l'espace alloué. Voir cette pour une discussion plus complète, y compris les raisons pour lesquelles cette fonction n'est pas disponible sur tous les compilateurs (ce qui est un inconvénient majeur si vous essayez d'écrire du code portable)."La sortie de nom de fichier"? La chaîne de caractères (le bloc de mémoire pointé par le
filename
pointeur contient les caractères qui ont été pointées parargv[2]
, jusqu'à et y compris la résiliation de'\0'
. La syntaxe pourstrcpy
eststrcpy(char *dest, const char *source);
qui n'est pas exactement ce que tu viens d'écrire... Voir par exemple cplusplus.com/reference/cstring/strcpyComme pour les "comment vous déclarez chaînes C" - une chaîne C est référencé par un pointeur bloc de mémoire (que vous devez assurez-vous est attribuée, et assez grande), , termine avec un
'\0'
caractère (pour lequel vous avez également besoin d'espace). Il y a différentes techniques pour allouer l'espace; lafilename[64]
est un (nota - il est assez grand pour un 63 chaîne de caractères _plus de terminaison de'\0'
), ouconst char myString = "hello world";
si vous n'avez pas l'intention de le changer (la mémoire est allouée pour vous), ou de commencer avecchar myString;
et de suivre avecmyString = malloc(100);
pour créer de l'espace.génial explication.Tous les 'C' enseignant doit enseigner comme cela 🙂
merci beaucoup. J'ai été la lutte contre les pointeurs et pour plus de 20 ans - I k ow ahurissant comment ils peuvent être jusqu'à ce que la pièce de un cent gouttes. Juste essayer d'aider un autre passager sur la route de code...
OriginalL'auteur Floris
Depuis que vous avez marquées ce que le C++ (et personne n'a encore mentionné):
argv
est déjà un C-gamme de style, alors il n'est pas besoin de le copier à un autre (sauf si vous voulez juste de gaspiller de l'espace). Si vous avez vraiment envie de le copier dans quelque chose, unstd::string
objet serait une meilleure approche:argv
pour votre programme de travail!OriginalL'auteur Zac Howland
Vos variables
filename
etmessage
sontchar
pointeur tableaux, et pas de style C à cordes (qui doit être nulchar
tableaux). Si vous avez besoin de déclarer leur type:et l'utilisation
strcpy
:l'appel à
open
est similaire:Vous avez eu une aray plein de onu-initialisé
char
pointeurs.OriginalL'auteur Yu Hao
>>> je suis encore assez débutant et je vais avoir l'immense difficulté à comprendre c des chaînes de caractères. Quelle est la différence entre char et char[] et char* []?*
Pointeurs sont difficiles à comprendre la première fois que vous les rencontrez.
Quand vous avez une variable de nom de fichier, *nom de fichier déréférence cette variable, ce qui signifie qu'il n'est pas le pointeur, mais la chose pointé.
Vous surtout si le programme avait droit. le problème a été votre manque de clarté sur la façon d'utiliser un pointeur. Voici votre code, révisé un peu de travail. J'ai commenté les pièces cassées de sorte que vous pourrait comparer cassé fixe.
Après avoir modifié le code, ça en jette toujours une erreur de segmentation.
quand aucun argument donné. fixe.
OriginalL'auteur ChuckCottrill
La réponse courte à votre question précise, c'est que
char*
etchar[]
peut à la fois être utilisé comme C-strings.char* []
sur l'autre main est un tableau deC-strings
.OriginalL'auteur Code-Apprentice