2010-02-27 33 views
5

vấn đề của tôi là trong chuyển đổi một char đến chuỗi tôi phải vượt qua để strcat() một char để nối thêm vào một chuỗi, làm thế nào tôi có thể làm gì? cảm ơn!C char để string (đi qua char để strcat())

#include <stdio.h> 
#include <string.h> 

char *asd(char* in, char *out){ 
    while(*in){ 
     strcat(out, *in); // <-- err arg 2 makes pointer from integer without a cast 
     *in++; 
    } 
    return out; 
} 

int main(){ 
    char st[] = "text"; 
    char ok[200]; 
    asd(st, ok); 
    printf("%s", ok); 
    return 0; 
} 

Trả lời

5

Kể từ ok được trỏ đến một mảng chưa được khởi tạo nhân vật, tất cả nó sẽ được giá trị rác, vì vậy nơi nối (bằng strcat) sẽ bắt đầu không rõ. Ngoài ra strcat lấy một chuỗi C (tức là một mảng các ký tự bị chấm dứt bởi ký tự '\ 0'). Cho char a[200] = "" sẽ cung cấp cho bạn một [0] = '\ 0', sau đó một [1] để a [199] thiết lập để 0.

Edit: (thêm phiên bản chỉnh sửa của mã)

#include <stdio.h> 
#include <string.h> 

char *asd(char* in, char *out) 
{ 

/* 
    It is incorrect to pass `*in` since it'll give only the character pointed to 
    by `in`; passing `in` will give the starting address of the array to strcat 
*/ 

    strcat(out, in); 
    return out; 
} 

int main(){ 
    char st[] = "text"; 
    char ok[200] = "somevalue"; /* 's', 'o', 'm', 'e', 'v', 'a', 'l', 'u', 'e', '\0' */ 
    asd(st, ok); 
    printf("%s", ok); 
    return 0; 
} 
3

strcat sẽ không thêm các ký tự đơn lẻ. Thay vào đó, phải mất const char* (chuỗi đầy đủ kiểu C) được thêm vào chuỗi trong thông số đầu tiên. Vì vậy, chức năng của bạn nên đọc một cái gì đó như:

char *asd(char* in, char *out) 
{ 
    char *end = out + strlen(out); 

    do 
    { 
     *end++ = *in; 

    } while(*in++); 

    return out; 
} 

Vòng lặp do-while sẽ bao gồm dấu đầu cuối không cần thiết ở cuối chuỗi kiểu C. Hãy chắc chắn rằng chuỗi đầu ra của bạn được khởi tạo với một số không dấu chấm hết ở cuối hoặc ví dụ này sẽ thất bại.

Và như một sang một bên: Hãy suy nghĩ về những gì *in++; làm. Nó sẽ tăng in và dereference nó, đó là rất giống như in++, do đó, * là vô ích.

1

Để xem xét mã của bạn, tôi có thể làm cho một số lời khuyên liên quan đến nó, đây không phải là một lời chỉ trích, thực hiện việc này với một chút muối sẽ cho phép bạn trở thành một lập trình C tốt hơn:

  • Không có nguyên mẫu chức năng.
  • Sử dụng sai con trỏ
  • Xử lý chức năng strcat được sử dụng không chính xác.
  • Lạm dụng nó - không cần chức năng asd!
  • Cách xử lý các biến đáng chú ý là char mảng không được khởi tạo đúng cách.
 
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char st[] = "text"; 
    char ok[200]; 
    ok[0] = '\0'; /* OR 
    memset(ok, 0, sizeof(ok)); 
    */ 
    strcat(ok, st); 
    printf("%s", ok); 
    return 0; 
} 

Hope this helps, Trân trọng, Tom.

+0

Sử dụng "asd" chức năng cho phép asd sẽ được sử dụng trong ngữ cảnh khác, cho phép chính bỏ qua các tính toán đằng sau asd chính nó. Tôi luôn chọn tham gia một chức năng, bất kể trường hợp nào có thể xảy ra. –

+0

Ngoài ra, bản ghi nhớ của bạn() hoàn toàn không liên quan, chỉ cần khai báo như sau: char ok [200] = {0}; –

+0

@rogue: Bạn có thể làm theo cách đó nếu bạn muốn, không có phương tiện rõ ràng, theo cách của bạn hoặc cách tôi đã đề cập, chú ý đến điểm đánh dấu nhận xét OR và memset ... hoặc là phụ thuộc vào phong cách của bạn! – t0mm13b

0

Để chuyển đổi một nhân vật thành một chuỗi (null chấm dứt), bạn chỉ có thể làm:

char* ctos(char c) 
{ 
    char s[2]; 
    sprintf(s, "%c\0", c); 
    return s; 
} 

dụ làm việc: http://ideone.com/Cfav3e

+0

Không hoạt động vì 'c' vẫn thuộc loại' char'. 'sprintf' hy vọng sẽ làm việc với các chuỗi. – skytreader

+0

Điều này dường như hoạt động. 'sprintf' có thể lấy một đối số ký tự nếu nó điền vào một'% c' trong chuỗi định dạng. –

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