C: попытка удалить пробелы из строки без использования каких-либо функций библиотеки строк - PullRequest
2 голосов
/ 09 апреля 2020

Итак, я пытаюсь найти способ напечатать строку без пробелов, и она почему-то не работает, когда я вхожу в строку в программе, она ничего не печатает.

#include <stdio.h>

char *removeSpaces(char *inString);

int main() {
    char str1[50];
    printf("Enter a string : ");
    scanf("%s", &str1);
    removeSpaces(str1);
}

char *removeSpaces(char *inString) {
    char str2[50];
    int j = 0;

    for (int i = 0; i < 50; i++) {
        if (inString[i] != ' ') {
            str2[j] = inString[i];
            j++;
        }
    }

    for (int i = 0; i < 50; i++) {
        printf("%s", str2[i]);
    }
}

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Неверный подход к вводу

Ниже не будет сканироваться str1 ничего с пробелом.

// bad
char str1[50];
scanf("%s", &str1);

Вместо этого используйте fgets(), чтобы прочитать строку и сформировать строку .

char str1[50];
if (fgets(str1, sizeof str, stdin)) {
  // success!

Отрезать потенциальный трейлинг '\n' при желании.

  str1[strcspn(str1, "\n")] = '\0';

Считывает последний конец строки

Циклы считывают размер массива. Должен быть l oop до нулевого символа .

// for (int i = 0; i < 50; i++)
for (int i = 0; inString[i]; i++)

Отсутствует \ 0

Формирование строки в str2[] является неполным так как в нем отсутствует нулевой символ '\0'.

str2[j] = '\0'; // add after the loop

Предупреждения не полностью включены

Ниже следует предупредить о несоответствии "%s" с str2[i].

for (int i = 0; i < 50; i++) {
    printf("%s", str2[i]);
}

Вместо этого без al oop.

 printf("%s", str2);

Это самый большой урок, который нужно здесь усвоить. Полностью включив предупреждения, компилятор обеспечивает быструю обратную связь о том, что что-то не так или сомнительно; быстрее, чем Stackoverflow.

Отсутствует возврат

char *removeSpaces(char *inString), как ожидается, вернет char *, но в коде отсутствует return something;.

3 голосов
/ 09 апреля 2020

Вы также можете использовать указатели для обхода областей памяти, проверяя каждую позицию на нежелательное значение char. Вот ваша функция, измененная для использования этого метода:

char *removeSpaces(char *inString);// your original prototype
char *remove_char(char *inString, char c);//generalized  

int main(void) {
    //use suggestions in other answer for correct user input
    const char str1[] = {"this is a string with spaces"};//for simple illustration

    printf("%s\n", removeSpaces(str1));
    printf("%s\n", remove_char(str1, ' '));
    return 0;
}

char *removeSpaces(char *inString)// your original prototype
{
    if(!inString) return (char *)"bad input";
    char *from; // "read" pointer
    char *to; // "write" pointer

    from = to = inString; // init both read and write pointers to original string

    while (*from) 
    { 
        if( (*from != ' ') && (*from != '\t') && (*from != '\n'))
        { 
            *to++ = *from; 
        } 
        from++; 
    } 
    *to = 0; 

    return inString;// add a return statement to return the char *
}

//optionally, create your function to remove any unwanted character
char *remove_char(char *inString, char c)//generalized  
{
    char *from; // "read" pointer
    char *to; // "write" pointer

    from = to = inString; // init both read and write pointers to original string

    while (*from) 
    { 
        if (*from != c) 
        { 
            *to++ = *from; 
        } 
        from++; 
    }  
   *to = 0; 

    return inString;// add a return statement to return the char *
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...