2013-09-06 50 views
10
#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    int main(int argc, char *argv[]){ 
     int fir; //badly named loop variable 
     char *input[] = calloc(strlen(argv), sizeof(char)); //initializing an array 
     for(fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv 
      strcat(input, argv[fir]); // appending to input 
      } 

Lỗi tôi nhận được là cho dòng 6. nó nói "chuyển đối số 1 của 'strlen' từ loại con trỏ không tương thích. Tôi nhận được lỗi tương tự cho Nó cũng nói cho một char ** nhưng dự kiến ​​một const char * cho cả hai chức năng.Tôi đang cố gắng để cư một mảng mới với tất cả các yếu tố của argv ngoại trừ đầu tiên.Tôi đã thử argv = & argv [1] và nó đã không làm việc. hiện strlen() và strcat() chức năng không mất nhiều mảng char?Cách tìm độ dài của argv [] trong C

+0

Tôi nghĩ rằng bạn muốn một chỉ số vào mà 'argv []', nhưng đừng đi ra ngoài '[0 .. (argc-1]' – WhozCraig

Trả lời

19
int main(int argc, char *argv[]) 

argv là một mảng của các con trỏ tới char (ví dụ: mảng các chuỗi). Độ dài của mảng này được lưu trữ trong đối số argc.

strlen có nghĩa là được sử dụng để truy lục độ dài của chuỗi đơn phải được kết thúc bằng không, hành vi này không được xác định.

+1

Tôi nghĩ rằng tôi hiểu.Tôi không thể sử dụng argv [] bởi vì nó không thực sự là một mảng của char, một mảng các con trỏ đến char's? nếu tôi tạo một bản sao của argv [x] và sử dụng nó trong strcat như strcat (input, copyargv [x]) sẽ hoạt động? – user1787351

+0

argv [] là một mảng các chuỗi (tức là một mảng con trỏ tới con trỏ char, trong đó mỗi con trỏ char trỏ đến đầu chuỗi); argc cho bạn biết có bao nhiêu các chuỗi bạn có, strlen trả về độ dài của chuỗi được truyền trong, vì vậy nó có thể bật y được gọi trên một char *, tức là char [], tức là chuỗi): strlen (argv [i]), trong đó i nằm giữa 0 và argc. – VeraKozya

0

argv là một mảng của char*. Kích thước của mảng này là argc. Bạn phải vượt qua một yếu tố này mảng thành strlen.

0

Có lẽ bạn có nghĩa là để làm một cái gì đó như thế này:

size_t argv_length(char** argv) 
{ 
    size_t ret = 0; 
    while(*(++argv)) 
     ret += strlen(*argv); 

    return ret; 
} 

?

0

argv lấy một arryas char * nhưng bạn cần chuyển argc sang strlen chứ không phải toàn bộ mảng. Sau đó, bạn sẽ không nhận được bất kỳ lỗi nào trên strcat.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(int argc, char *argv[]){ 
int fir; //badly named loop variable 
char *input[] = calloc(strlen(argc), sizeof(char)); //initializing an array 
for(fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv 
strcat(input, argv[fir]); // appending to input 
} 
4

Không chắc tại sao không ai đề xuất thay đổi strlen để chỉ một mục cụ thể trong mảng con trỏ đến char?

strlen(argv[0])  // also, 1, 2, up to (argc - 1) 

Ngoài ra, http://www.cdecl.org/ giúp xác nhận rằng các tuyên bố char *argv[] là: declare argv as array of pointer to char

0

argv là một mảng của char, strlen chỉ mất chuỗi. Nếu bạn muốn nhận được độ dài của mỗi đối số trong argv (đó là những gì tôi đã cố gắng làm), bạn phải lặp qua nó, truy cập vào các phần tử như vậy argv[i][j]. Sử dụng đối số argv[i][j] != '\0'. Nếu bạn chỉ muốn số lượng đối số sử dụng argc.

0
int count = 0; 
while(argv[++count] != NULL); 

Bây giờ, số lượng sẽ có chiều dài của argv

Các vấn đề liên quan