2012-06-29 39 views
7

fgets verilen bir char* dönüştürebilirsiniz bilmek istiyorum.C char içine char * dönüştürmek

Bunun daha önce yayınlandığına eminim, ancak yapmak istediğim şeyi yapan bir şey bulamadım. Herhangi bir cevap takdir edilir.

DÜZENLEME: İşte kod. Eğer dert etmenize gerek kalmaz her şeyden önce

char *filename = "file.txt"; 
FILE *file = fopen(filename, "r"); 
if(file != NULL) { 
    char line[260]; 
    char *fl; 
    while(fgets(line, sizeof line, file) != NULL) { 
    // here I combine some strings with the 'line' variable. 
    str_replace(line, "\"", "\"\""); // A custom function, but it only takes char*'s. 
    } 
    printf(fl); 
    printf("\n"); 
} else { 
    printf(" -- *ERROR* Couldn't open file.\n"); 
} 
+15

Hayır, yapmazsınız. 'fgets()' 'char'' bir 'char'' sonucu döndürür. Lütfen, yapmaya çalıştığınız şey hakkında, daha önce gerçek bir kod yazarak bize daha iyi bir fikir verin. –

+0

Oh. Benim hatam. Bu, artık bu soruya gerçekten ihtiyacım olmadığı anlamına geliyor. – Matthew

+0

O zaman soruyu kendiniz silebilirsiniz (ve yapmalı). –

cevap

16

Eh, line, char s bir dizidir ve bu yüzden bir char * (önemli farklılıkların comp.lang.c FAQs bakınız) kadar aynı şekilde manipüle edilebilir o.

Ancak, eğer ihtiyacınız olanı genel soruya bir cevap ...

& operatör olduğunu istiyorum:

char c; 
char *pChar = &c; 

Fakat PChar bir işaretçi etmektir unutmayın ki char ve c sadece kapsam dahilinde geçerli olacaktır. Bu, pChar'ı bir işlevden döndüremeyeceğiniz ve çalışmasını bekleyemeyeceğiniz anlamına gelir; yığının bir kısmına işaret eder ve geçerli kalmasını bekleyemezsiniz. Size bir işaretçi verecektir & operatörü kullanarak

char c; 
char *pChar = malloc(sizeof(char)); 

/* check pChar is not null */ 

*pChar = c; 
+0

"Satır" bir "char *' dır, çünkü bu bir "char's" dizisidir - Hayır, diziler işaretçiler değildir. [Comp.lang.c SSS] bölümünün 6. bölümünü okuyun (http://www.c-faq.com). –

+0

@KeithThompson: "... birbirleriyle yakından ilişkili olsalar". [Soru 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

Soru 6.2 tamamen farklı kavramların olduklarını açıkça belirtmektedir. Evet, yakından ilişkilidirler; herhangi bir programlama dilinde birçok kavram var. C dizilerinin gerçekten işaretçiler olduğu konusunda yaygın bir yanlış anlama var; buna eklemeyelim. –

4

: Bir dönüş değeri olarak geçmek istiyorsanız

, sen c değerini yazmak için bazı bellek malloc ve ardından gösterici kullanmak gerekecektir Dancrumb'ın belirttiği gibi, karaktere, ancak bahsettiği gibi, işaretçiyi geri göndermenizi engelleyen bir sorun sorunu vardır.

Eklemek zorunda olduğum bir şey, bir char* isteğinin nedeninin, printf veya benzeri bir dizede bir dize olarak kullanabilmeniz için olduğunu tahmin etmekti. Bu şekilde kullanabilirsiniz, çünkü dize NULL sonlandırılmayacaktır. Bir diziden bir char dönüştürmek için,

char c = 'a'; 
char *ptr = malloc(2*sizeof(char)); 
ptr[0] = c; 
ptr[1] = '\0'; 

sonra ptr özgür unutmayın böyle bir şey yapmak gerekir!

+1

malloc argümanı: 'sizeof (char)' 'std; Sadece yazabilirsiniz: 'malloc (2)' eşdeğerdir. – Jack

+0

@Jack, 'sizeof' kullanmanın normal formülünü izlemekten ziyade bunu yapmak için belirli bir neden var mı? – Daniel

+0

Char'ın bir bayt olması istendiğinde, chars sayısını bir bayt sayısına dönüştürmek gereksiz yere gereksiz görünüyor. 'Foo'nun bir kopyasına yer ayırırken' malloc ((strlen (foo) +1) * sizeof (char)) 'yazabiliyor musunuz? Her durumda, foo türünden bağımsız olarak çalışan foo = malloc (n * sizeof * foo) 'yi tercih ederim. –