2012-01-26 23 views
5

Tôi đang cố gắng tìm hiểu C, và tôi tự hỏi tại sao điều này không hoạt động?Đặt biến chuỗi trong C từ argv [1]

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char testvar[] = argv[0]; 
    //do something with testvar 

    return 0; 
} 

Trả lời

6

Bạn có thể làm điều này thay vì:

char *testvar = argv[0]; 

Hoặc có thể:

char *testvar = strdup(argv[0]); 
/* Remember to free later. */ 

Như pmg ghi chú, strdup không phải là tiêu chuẩn. Thực hiện nó bằng cách sử dụng malloc + memcpy là một bài tập tốt.

Hoặc thậm chí:

char testvar[LENGTH]; 
if (strlen(argv[0]) >= LENGTH) 
    fprintf(stderr, "%s is too long!\n"); 
else 
    strcpy(testvar, argv[0]); 

Nhưng sau đó một lần nữa bạn có thể tìm kiếm:

char testvar[] = "testvar"; 
1

Đó cú pháp chỉ có hiệu lực để khởi tạo một mảng char từ một chữ, tức là khi bạn rõ ràng viết trong mã nguồn những ký tự nào phải được đặt trong mảng.

Nếu bạn chỉ muốn một con trỏ đến nó (tức là "một tên khác" để đề cập đến nó), bạn có thể làm:

char * testvar = argv[0]; 

nếu thay vào đó bạn muốn có một bản sao của nó, bạn phải làm:

size_t len = strlen(argv[0]); 
char * testvar = malloc(len+1); 
if(testvar==NULL) 
{ 
    /* allocation failed */ 
} 
strcpy(testvar, argv[0]); 
/* ... */ 
free(testvar); 
1

Bạn cần hằng số để khởi tạo đối tượng. argv[0] không phải là hằng số.
"foobar" dưới đây là hằng số

#include <stdlib.h> 
#include <string.h> 

int main(int argc char **argv) { 
    char array[] = "foobar"; /* array has 7 elements */ 
    char *testvar; 

    testvar = malloc(strlen(argv[0]) + 1); /* remember space for the NUL terminator */ 
    if (testvar != NULL) { 
     strcpy(testvar, argv[0]); 
     /* do something with testvar */ 
     free(testvar); 
    } else { 
     /* report allocation error */ 
    } 
    return 0; 
} 
Các vấn đề liên quan