我有一个入门级C指针问题...假设我有两个字符串,我想打印它们。我在下面的代码中误解了什么?
void print_array(char **array[]) {
int i = 0;
while((*array)[i] != NULL) {
printf("%s\n", (*array)[i++]);
}
return;
}
int main(int argc, char** argv) {
char str1[] = "hello";
char str2[] = "world";
char **array = {str1, str2};
print_array(&array);
return (EXIT_SUCCESS);
}
要使我的代码正常工作,我需要访问print_array
答案 0 :(得分:3)
另一种看法(更多重构)。
错误修正:
print_array
中的内容(不要追求三星级编程,除非你必须这样做)main
传递到print_array
其他变化:
return
- 语句(main
最后有一个隐含的return 0;
)0
/ NULL
print_array
const
中使用print_array
print_array
main
(需要C99)#include <stdio.h>
void print_array(const char *const array[]) {
while(*array)
printf("%s\n", *array++);
}
int main() {
print_array((const char*[]){"hello", "world", 0});
}
撤消清除步骤,更改print_array
的签名:
#include <stdio.h>
void print_array(char **array[]) {
for(char** p = *array; *p; p++)
printf("%s\n", *p);
}
int main() {
print_array(&(char**){(char*[]){"hello", "world", 0}});
}
答案 1 :(得分:2)
*
中有print_array
个void print_array(char *array[]) {
int i = 0;
while(array[i] != NULL) {
printf("%s\n", array[i++]);
}
}
太多了。它应该是这样的:
char **array
这使得称之为直截了当。将char *array[]
更改为NULL
。并且不要忘记在数组的末尾添加int main(int argc, char** argv) {
char str1[] = "hello";
char str2[] = "world";
char *array[] = {str1, str2, NULL};
print_array(array);
return EXIT_SUCCESS;
}
条目。
print_array
另一方面,如果您不应该修改array
,那就太烦人了。您需要另一个变量才能暂时保留char *array[] = {str1, str2, NULL};
char **p = array;
print_array(&p);
的地址。
*
这就是为什么我说print_array
中有{{1}}个太多{/ 1}}。
答案 2 :(得分:1)
由于您正在处理数组,请将数组成员的数量传递给print_array
。上面的代码是UB。
修复您的代码:
void print_array(char *arr[], int cnt) {
int i = 0;
for(i = 0; i < cnt; i++) {
printf("%s\n", arr[i]);
}
return;
}
int main(int argc, char** argv) {
char str1[] = "hello";
char str2[] = "world";
char *arr[] = {str1, str2};
print_array(arr, 2);
return (0);
}
答案 3 :(得分:0)
另一种方式:
#include <stdio.h>
void print_array(char *array[]) {
int i = 0;
while (array[i] != 0) {
printf("%s\n", array[i++]);
}
return;
}
int main(int argc, char** argv) {
char str1[] = "hello";
char str2[] = "world";
char *array[] = {str1, str2, 0};
print_array(array);
return 0;
}