Urutan terbalik dalam array karakter di C
Petunjuknya sangat membingungkan saya. Saya memiliki fungsi yang mengambil argumen argc (jumlah argumen yang berupa string + 1 yaitu nama kode) dan char * argv [], yang, jika saya mengerti dengan baik, adalah array pointer. Sekarang sebagai hasilnya saya perlu mencetak pada setiap baris argumen (string) dan string terbalik. Ini berarti bahwa jika saya memberikan argumen halo dunia, saya perlu memiliki:
hello olleh
world dlrow
Saya mencoba menerapkan bagian dari kode:
int main(int argc, char *argv[])
{
int i = 1;
int j;
while (i < argc)
{
while (argv[i][j] != 0) {
printf("%c", argv[i][j]);
j++;
}
i++;
}
return 0;
}
}
Dan sekarang saya benar-benar tersesat. Lingkaran dalam tidak berfungsi. Saya tahu bahwa argv [i] melewati semua string argumen saya, tetapi saya jelas perlu memasukkan string (array karakter), untuk menukar pointer. Saya juga tidak mengerti mengapa perbedaan antara argv [0] dan * argv, karena dalam teori argv [0] mencetak elemen pertama dari array yang merupakan pointer, jadi alamat, tetapi bukannya ini mencetak argumen pertama .
Jawaban
char* argv[]adalah "larik pointer ke karakter" Penting untuk mempelajari cara membaca tipe dalam C; karena, tipe-tipe tersebut akan mengaktifkan / menggagalkan kemampuan Anda untuk melakukan sesuatu.
Jenis dibaca dari kanan ke kiri. []adalah tipe array, dengan jumlah elemnts yang tidak ditentukan *adalah tipe pointer, charadalah tipe dasar. Gabungkan ini, dan Anda sekarang memiliki "larik pointer ke karakter"
Jadi untuk mendapatkan sesuatu argv, pertama-tama Anda akan menentukan elemen mana yang ada di dalam array. argv[0]akan menentukan elemen pertama. Mari kita lihat apa yang dikembalikan. Karena array bukan bagian dari hasil, jawabannya adalah "penunjuk ke karakter"
char* line = argv[0];
would capture the pointer to a character, which is stored in argv[0].
In C a char* or a "pointer to a character" is the convention used for a string. C doesn't have a new type for "string"; rather it uses pointers to characters, where advancing the pointer eventually runs into the \0 character that signals the string's end.
int main(int argc, char* argv[]) {
int index = 0;
while (index <= argc) {
char* line = argv[index];
printf("%d, %s\n", index, line);
index++;
}
}
should dump the arguements passed to your program. From there, I imagine you can handle the rest.
Notice that I never converted the pointer to an array. While arrays can be used as pointers if you never specify the index of the array, in general pointers can't be used as arrays unless you rely on information that isn't in the type system (like you clearly grabbed the pointer from an array elsewhere).
Good luck!
---- Updated to address the question "How do I reverse them?" ----
Now that you have a simple char* (pointer to a character) how does one reverse a string?
Remember a string is a pointer to a character, where the next characters eventually end with a \0 character. First we will need to find the end of the string.
char* some_string = ...
char* position = some_string;
while (*position != 0) {
position++;
}
// end_of_string set, now to walk backwards
while (position != some_string) {
position--;
printf("%c", *end_of_string);
}