Saya diminta untuk melakukan ini:

Buat fungsi skip_spaces() menerima string s, yang mengembalikan referensi ke elemen pertama dalam array yang bukan karakter spasi (jika string hanya terdiri dari spasi, pointer akan mengatasi null terminator \0). Kemudian buat program utama prinsipal yang memanggil fungsi ini dengan string baca di stdin. Dari hasil yang diberikan, program kemudian akan menampilkan string dari non-spasi pertama char. "

Saya baru mulai menggunakan pointer, dan saya jelas bukan ahli C, jadi saya cukup tersesat di sini. Inilah yang saya dapatkan sejauh ini:

Di skip_spaces.c Saya punya:

char *skip_spaces(char *s[]) {
  char *ref = '\0';
  int i = 0;
  while (*s[i] != '\0') {
    if (*s[i] == ' '):
      i++;
    else {
      *ref = *s[i];
    }
  }
}

Di skip_spaces.h Saya punya:

char *skip_spaces(char *);

Dan program utama saya:

#include "skip_spaces.h"
#include <stdio.h>

int main(void) {
    int input;
    char *str[30];
    char *spaceless;
    printf("input string : ");
    input = scanf("%s", str);
    if (input == 1) {
        int i = 0;
        spaceless = skip_spaces(str);
        printf("modified string : %s.", spaceless);
    return -1;
}

Sekarang, saya belum yakin jika programnya bahkan melakukan apa yang saya inginkan.

Masalah saya di sini adalah bahwa saya bahkan tidak bisa mengujinya pada saat ini: Saya sudah mencoba sepoi-barang, saya tidak akan pernah bisa mengkompilasi dengan benar, setiap kali saya memperbaiki masalah di suatu tempat, saya mendapatkan masalah lain di mana. Cukup banyak semua kesalahan berasal dari program utama saya.

Saya memiliki dua kesalahan yang sangat gigih:

  • error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’

Titik kesalahan ini pada input saya = garis Scanf, lebih tepatnya ke str var saya

  • skip_spaces.h:1:8: note: expected ‘char *’ but argument is of type ‘char **’

Saya sudah mencoba gelisah, menempatkan * di sini dan & di sana, tetapi saya memiliki 2 kesalahan ini, baik saya punya lebih banyak lagi ...

Saya bahkan menemukan beberapa kode kerja untuk fungsi yang tepat ini di Internet (sebagian besar berasal dari mana sebenarnya), tetapi setiap kali saya mencoba menerapkan solusi kerja mereka dalam kode saya, saya mendapatkan kesalahan ini lagi. 100% pasti masalah saya berasal dari pemahaman pointer saya. Saya harap seseorang bisa menjelaskan sedikit cahaya.

2
froggyalex 5 April 2021, 17:02

1 menjawab

C sudah menyediakan fungsi yang dapat melakukan itu untuk Anda. Fungsi strspn(const char *s, const char *accept) akan mengembalikan jumlah karakter awal di s terdiri dari karakter dalam string accept. Lihat man 3 strspn

Jika Anda menggunakan " \t\n" (untuk space, tab, newline) untuk accept kemudian fungsi mengembalikan jumlah karakter spasi yang terkemuka di string {{x5 }}. Jika s Apakah semua spasi, mengembalikan jumlah karakter di s.

Yang perlu Anda lakukan adalah mengembalikan s + strspn (s, " \t\n") dan Anda memiliki jawaban Anda, mis.

const char *skip_spaces (const char *s)
{
    return s + strspn (s, " \t\n");     /* return pointer to 1st non-space or '\0' */
}

Contoh penuh adalah:

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

const char *skip_spaces (const char *s)
{
    return s + strspn (s, " \t\n");     /* return pointer to 1st non-space or '\0' */
}

int main (void) {
    
    const char *str[] = { "     w/leading space",
                          "w/o leading space",
                          "         \t  " };
    size_t n = sizeof str/sizeof *str;
    
    for (size_t i = 0; i < n; i++) {
        if (!*skip_spaces (str[i]))
            printf ("skip_spaces (str[%zu]): '%s' (all spaces)\n", 
                    i, skip_spaces (str[i]));
        else
            printf ("skip_spaces (str[%zu]): '%s'\n", i, skip_spaces (str[i]));
    }
}

Contoh penggunaan / output

$ ./bin/skip_spaces
skip_spaces (str[0]): 'w/leading space'
skip_spaces (str[1]): 'w/o leading space'
skip_spaces (str[2]): '' (all spaces)

Selalu ada lebih dari satu cara untuk Kulit-the-kucing di c :)

Juga ketika mengunjungi halaman manual, perhatikan fungsi pendamping strcspn (const char *s, const char *reject) Apakah sebaliknya, mengembalikan jumlah karakter awal di s tidak mengandung salah satu karakter di reject. (cukup berguna untuk memotong '\n' pada akhir buffer diisi oleh fgets() atau Posix getline()).

1
David C. Rankin 5 April 2021, 15:41