C ++ Мне нужно понять, где использовать указатели и двойные указатели - PullRequest
0 голосов
/ 13 июля 2020

У меня есть эта базовая c многофункциональная программа, цель которой - выполнить четыре функции в файле, который содержит некоторые строки ... возьмите строку, например, возьмите строку и поместите ее в верхний регистр. Я понимаю, что это еще не идеально, но мне нужно понять, почему мои char * и char ** делают какой-то беспорядок.

большое спасибо за ваше время


#include <iostream> //to use enter and exit
#include <cstring>
#include <string> 
#include <fstream> //to use files
using namespace std;

/*--------------------------FONCTION PART-----------------------------------*/

//define one fonction for each transformation 

//FONCTION 1 

void fonctionu (char* argv){
   
   char pattern = argv[2];
   char file = argv[3];
   
   fstream data(file, ios::in);  
   
   if (data){
     string line;

     while (getline (data ,line)){
      unsigned found = line.find(pattern);
      if (found != string::npos) {
       for (int i = 0; line[i]!='\0'; i++) {
         if(line[i] >= 'a' && line[i] <= 'z') {
           line[i] = line[i] - (32);// (ASCII)
           cout<<line[i];
      }}  }
      if (found == string::npos) {
        for (int i = 0; line[i]!='\0'; i++) {
         cout<<line[i];
        }}}}}

//FONCTION 2

void fonctiond( char* argv){ //remove line with xyz

  char pattern = argv[2];
  char file = argv[3];
  fstream data(file, ios::in);
  
  if (data){
     string line;
     while (getline (data ,line)){
      unsigned found = line.find(pattern); //as a reminder argv[2] is the pattern (warning : it need to be an unsigned to compare two unsigned)
      if (found != string::npos) {
      //delete the line of the file when there is the pattern 
       cout<<'\0'; }
      if (found == string::npos){
        for (int i = 0; line[i]!='\0'; i++) {
          cout<< line[i];
     }}}}}

//FONCTION 3 

void fonctionc( char* argv){

  char pattern = argv[2];
  char file = argv[3];
  fstream data(file, ios::in); 
  
  if (data ){
     string line;
     while (getline (data ,line)){
       unsigned found = line.find(pattern); //as a reminder argv[2] is the pattern 
       if (found != string::npos) {
        for (int i = 0; line[i]!='\0'; i++) {
          cout<< "\033[31m"<< line[i]; //the line will be red
        } 
       }
       if (found == string::npos){
        for (int i = 0; line[i]!='\0'; i++) {
          cout<< line[i];
       }}}}}

//FONCTION 4 
//replace the pattern xyz by abc
void fonctions ( char* argv){

  char pattern = argv[2];
  char file = argv[3];
  fstream data(file, ios::in); 
  
  if (data ){
     string line;

     while (getline (data ,line)){
      unsigned found = line.find(pattern);
      if (found != string::npos) {
       for (int i = 0; line[i]!='\0'; i++) {
         if(line[i] >= 'a' && line[i] <= 'z') {
           line[i] = line[i] - (97); // (ASCII) //we creat a shift that allow to make the x became a 'a' and the y a 'b'...etc
           cout<<line[i];}} 
      } 
      if (found == string::npos) {
       for (int i = 0; line[i]!='\0'; i++) {
          cout<<line[i];
      }}}}}


/*--------------------------MAIN PART---------------------------------------*/

int main(char* argv){

  // ipsacs : argv[0]
  //option : 
  string a = argv[1]; //string ! to compare line 103,108 and 112
  // pattern : argv[2];
  //file :  argv[3];
  
  if (argv[1]=='\0' || argv[2]=='\0'){
    cout <<"ERROR"<<'\n';}

  if (a == "u"){
     char fonctionu (argv);}
  if (a== "d"){
     char fonctiond(argv);}
  if (a == "c"){
       char fonctionc(argv);}
  if (a == "s"){
       char fonctions(argv);} 
  return 0;
  }

/*--------------------------TEST PART--------------------------------------*/
/*
pour compiler : g++ -Wall ipsacs.cpp -o ipsacs
./ipsacs u xyz foo //how the program would receive arguments, basically

Le programme ne renvoie rien. 
*/

вот составление журнала:

main.cpp:22:30: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
    fstream data(file, ios::in);  
                              ^
In file included from main.cpp:8:0:
/usr/include/c++/6/fstream:902:7: note:   initializing argument 1 of ‘std::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits; std::ios_base::openmode = std::_Ios_Openmode]’
       basic_fstream(const char* __s,
       ^~~~~~~~~~~~~
main.cpp: In function ‘void fonctiond(char*)’:
main.cpp:46:29: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
   fstream data(file, ios::in);
                             ^
In file included from main.cpp:8:0:
/usr/include/c++/6/fstream:902:7: note:   initializing argument 1 of ‘std::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits; std::ios_base::openmode = std::_Ios_Openmode]’
       basic_fstream(const char* __s,
       ^~~~~~~~~~~~~
main.cpp: In function ‘void fonctionc(char*)’:
main.cpp:66:29: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
   fstream data(file, ios::in); 
                             ^
In file included from main.cpp:8:0:
/usr/include/c++/6/fstream:902:7: note:   initializing argument 1 of ‘std::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits; std::ios_base::openmode = std::_Ios_Openmode]’
       basic_fstream(const char* __s,
       ^~~~~~~~~~~~~
main.cpp: In function ‘void fonctions(char*)’:
main.cpp:88:29: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
   fstream data(file, ios::in); 
                             ^
In file included from main.cpp:8:0:
/usr/include/c++/6/fstream:902:7: note:   initializing argument 1 of ‘std::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits; std::ios_base::openmode = std::_Ios_Openmode]’
       basic_fstream(const char* __s,
       ^~~~~~~~~~~~~
main.cpp: At global scope:
main.cpp:109:5: warning: first argument of ‘int main(char*)’ should be ‘int’ [-Wmain]
 int main(char* argv){
     ^~~~
main.cpp:109:5: warning: ‘int main(char*)’ takes only zero or two arguments [-Wmain]
main.cpp: In function ‘int main(char*)’:
main.cpp:113:20: error: conversion from ‘char’ to non-scalar type ‘std::string {aka std::basic_string}’ requested
   string a = argv[1]; //string ! to compare line 103,108 and 112
              ~~~~~~^
main.cpp:121:26: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]
      char fonctionu (argv);}
                          ^
main.cpp:123:25: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]
      char fonctiond(argv);}
                         ^
main.cpp:125:27: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]
        char fonctionc(argv);}
                           ^
main.cpp:127:27: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]
        char fonctions(argv);} 
                           ^

1 Ответ

0 голосов
/ 13 июля 2020

A char * - это указатель на адрес памяти, содержащий символ, и часто используется для c -строк.

A char ** - это указатель на адрес памяти, содержащий указатель на адрес памяти, содержащий символ, и часто используется для массивов c -строк.

Ваша подпись main, если не является допустимой формой, поскольку не существует формы main, которая принимает только указатель символа. Форма, которую вы, скорее всего, ищете: int main( int argc, int **argv ). Он принимает два параметра: argc - количество аргументов, переданных программе, и argv, содержащий параметры в виде c -строк, переданных программе.

В основном методе как правило, вы должны убедиться, что argc является правильным, т.е. у вас есть правильное количество параметров, переданных в вашу функцию (примечание: всегда, по крайней мере, 1 будет argv[0] как имя программы).

std::string a = argv[1] это нормально, и это приведет к преобразованию строки, на которую указывает argv, в строку. При вызове ваших функций у вас есть char functionu(argv);. Вы захотите удалить char из этой строки; эффективно, как это написано, вы пытаетесь создать переменную char с именем functionu, которая имеет начальное значение argv.

Каждая из ваших функций, вместо того, чтобы принимать char * должен принимать char **, тогда, когда у вас есть что-то вроде char file = argv[3];, вы захотите изменить это на char *file = argv[3]; или std::string file = argv[3];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...