Проблемы с передачей указателей на функции - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь написать что-то, что будет принимать два аргумента командной строки (слово и буква), и удалить все вхождения этой буквы из слова.Например, если я передаю Hello и e, Hllo должен быть полученной строкой.

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

Любые указатели (без каламбура) будут с благодарностью!

// Function Prototypes
void remove_all_chars(char *, char *);

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

int main(int argc, char *argv[]) { //Function parameters allow for CLI arguments

    printf("%s\n", argv[1]);
    printf("%s\n", argv[2]);
    char *charTest2 = *argv[2];
    char *strTest = strdup(argv[1]);
    //char strTest[20];
    //char charTest[20];
    //strncpy(strTest, argv[1], 10);
    //strTest[0] = *argv[1];
    remove_all_chars(strTest, charTest2);
    printf("%s", strTest);

    return 0;

}


void remove_all_chars(char *str, char *c) {
    char *pr = str, *pw = str;
    while (*pr) {
        *pw = *pr++;
        pw += (*pw != c);
    }
    *pw = '\0';
}

РЕДАКТИРОВАТЬ: После добавления char* к моим типам данных я получаю следующие предупреждения:

Removing3.c:12:8: warning: incompatible integer to pointer conversion initializing 'char *' with an
      expression of type 'char'; remove * [-Wint-conversion]
        char *charTest2 = *argv[2];
              ^           ~~~~~~~~
Removing3.c:30:20: warning: comparison between pointer and integer ('int' and 'char *')
        pw += (*pw != c);
               ~~~ ^  ~
2 warnings generated.

РЕДАКТИРОВАТЬ: Вот предупреждения

Removing3.c:18:19: warning: incompatible integer to pointer conversion passing 'char' to parameter of
      type 'char *'; take the address with & [-Wint-conversion]
        remove_all_chars(strTest, charTest2);
                         ^~~~~~~
                         &
Removing3.c:2:29: note: passing argument to parameter here
void remove_all_chars(char *, char *);
                            ^
Removing3.c:18:28: warning: incompatible integer to pointer conversion passing 'char' to parameter of
      type 'char *'; take the address with & [-Wint-conversion]
        remove_all_chars(strTest, charTest2);
                                  ^~~~~~~~~
                                  &
Removing3.c:2:37: note: passing argument to parameter here
void remove_all_chars(char *, char *);
                                    ^
Removing3.c:19:15: warning: format specifies type 'char *' but the argument has type 'char' [-Wformat]
        printf("%s", strTest);
                ~~   ^~~~~~~
                %c
Removing3.c:30:20: warning: comparison between pointer and integer ('int' and 'char *')
        pw += (*pw != c);
               ~~~ ^  ~
4 warnings generated.

1 Ответ

0 голосов
/ 11 сентября 2018

Ваша функция принимает аргументы типа char*, но ваши локальные переменные char charTest2 = *argv[2]; char strTest = *argv[1] имеют тип char.Переменная типа char может содержать один символ, и ваши переменные будут содержать первую букву соответствующего argv.A char *, напротив, является указателем на символ в памяти;он часто указывает на первый из последовательности символов, затем рассматривается как «строка»;последовательность (т. е. строка) заканчивается символом окончания строки '\0', т. е. значением 0.

Сначала измените их на char*;Второе: я бы не стал напрямую изменять строки в argv, а сделал бы копию:

char *strTest = strdup(argv[1]); 
char *charTest2 = argv[2]; // will not be changed; no copy necessary

Если strdup недоступен, вы можете написать:

char *strTest = malloc(strlen(argv[1])+1);
strcpy(strTest,argv[1]);

И вам нужно изменить

    pw += (*pw != c);

на

    pw += (*pw != *c);
...