我在使用指標時遇到困難,我想知道如何使用指標獲取另一個函式的字串陣列的值?
我的代碼是:
char *getName(const char *complete_name) {
char buffer[50];
strcpy(buffer, complete_name);
int i = 0;
char *p = strtok (buffer, ",");
char *array[2]; //array[0] = last name and array[1] = first name
while (p != NULL) {
array[i ] = p;
p = strtok (NULL, ",");
}
printf("%s\n", array[0]); // last name
printf("%s\n", array[1]); // first name
return *array;
}
我的主要功能是:
int main() {
const char *patient = "Doe,John";
char *p;
int i;
p = getName(patient);
for ( i = 0; i < 2; i ) {
printf("%s\n", p[i]);
}
return 0;
}
我的目標是訪問我的主要變數陣列,我該怎么做?
謝謝 !
uj5u.com熱心網友回復:
buffer和array是只存在于函式內部的變數。因此回傳它們(直接或間接使用指標)是非法的。
你有兩個選擇。
- 讓函式分配動態記憶體
或者
- 分配記憶體
main并傳遞一個指向記憶體的指標
選項 1:動態記憶體
那可能是:
char **getName(const char *complete_name) {
char buffer[50];
strcpy(buffer, complete_name);
int i = 0;
char *p = strtok (buffer, ",");
char **array = calloc(2, sizeof *array);
while (i < 2 && p != NULL) {
array[i] = malloc(strlen(p) 1);
strcpy(array[i], p);
i;
p = strtok (NULL, ",");
}
if (array[0] != NULL) printf("%s\n", array[0]); // last name
if (array[1] != NULL) printf("%s\n", array[1]); // first name
return array;
}
int main() {
const char *patient = "Doe,John";
char **p;
int i;
p = getName(patient);
for ( i = 0; i < 2 && p[i] != NULL; i ) {
printf("%s\n", p[i]);
}
free(p[0]);
free(p[1]);
free(p);
return 0;
}
選項 2:記憶體分配main并傳遞給函式
void getName(const char *complete_name, char split[][50]) {
char buffer[50];
strcpy(buffer, complete_name);
int i = 0;
char *p = strtok (buffer, ",");
while (i < 2 && p != NULL) {
strcpy(split[i], p);
i;
p = strtok (NULL, ",");
}
printf("%s\n", split[0]); // last name
printf("%s\n", split[1]); // first name
}
int main() {
const char *patient = "Doe,John";
char split[2][50] = { 0 };
int i;
getName(patient, split);
for ( i = 0; i < 2; i ) {
printf("%s\n", split[i]);
}
return 0;
}
uj5u.com熱心網友回復:
您不能回傳對區域變數的參考。
char *getName(const char *complete_name)
{
const char *end = complete_name;
char *name;
while(*end && *end != ',') end ;
name = malloc(end - complete_name 1);
if(name)
{
memcpy(name, complete_name, end - complete_name);
name[end - complete_name] = 0;
}
return name;
}
int main(void)
{
char *str = "Doe,John";
char *name;
printf("%s\n", name = getName(str));
free(name);
}
如果兩者都想要:
char **getName(const char *complete_name)
{
char *wrkname;
char **sname = calloc(sizeof*sname, 2);
if(sname)
{
char *wrkname = strdup(complete_name);
sname[0] = wrkname;
while(*wrkname && *wrkname != ',') wrkname ;
if(*wrkname)
{
*wrkname = 0;
if(*wrkname) sname[1] = wrkname;
}
}
else
{ /* handle memory error */}
return sname;
}
int main(void)
{
char *str = "Doe,John";
char **name = getName(str);
if(name)
{
if(name[0]) printf("Name: %s\n", name[0]);
if(name[1]) printf("Surname: %s\n", name[1]);
free(name[0]);free(name);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338885.html
上一篇:顯示佇列洗掉后的資料
