2015-12-03 20 views
6

Jak dodać "." do char Array: = "Hello World" w C, więc otrzymuję char Array: "Hello World." Pytanie wydaje się proste, ale walczę.Jak dodać char/int do tablicy char w C?

próbowałem następujące:

char str[1024]; 
char tmp = '.'; 

strcat(str, tmp); 

Ale to nie działa. Pokazuje mi błąd: "przekazanie argumentu 2" strcat "powoduje, że wskaźnik jest liczbą całkowitą bez rzutu" Wiem, że w C znak może być użyty jako int. Czy muszę przekonwertować tmp na tablicę znaków lub czy istnieje lepsze rozwiązanie?

+0

S tr nie zawiera łańcucha, tylko deklaracja rozmiaru hehe –

+0

Możliwy duplikat [w jaki sposób mogę strcatować jeden znak do tablicy w C++] (http://stackoverflow.com/questions/27522984/how-can-i-strcat-one- znak-tablica-znak-w-c) – MikeCAT

+0

To był tylko przykład z Hello World, aby opisać problem. Musi być pusty jako pierwszy w moim prawdziwym programie. Program wypełni go później. Problem polega tylko na dodaniu znaku char/int do znaku Array – missjohanna

Odpowiedz

11

strcat posiada deklarację:

char *strcat(char *dest, const char *src) 

spodziewa 2 sznurki. While this compiles:

char str[1024] = "Hello World"; 
char tmp = '.'; 

strcat(str, tmp); 

będzie powodować złe problemów z pamięcią, ponieważ strcat szuka NUL cstring. Można to zrobić:

char str[1024] = "Hello World"; 
char tmp[2] = "."; 

strcat(str, tmp); 

Live example.

Jeśli naprawdę chcesz dołączyć char trzeba będzie zrobić własną funkcję. Coś takiego:

void append(char* s, char c) { 
     int len = strlen(s); 
     s[len] = c; 
     s[len+1] = '\0'; 
} 

append(str, tmp) 

Oczywiście możesz również sprawdzić rozmiar łańcucha itp., Aby pamięć była bezpieczna.

+1

Usunąłem moją odpowiedź i wsparłem twoją, wyjaśniłeś to lepiej –

+0

To jest droga. Twoja funkcja dopełniająca spełni zadanie. – bruceg

+0

Muszę zdefiniować char tmp [2] ze zmienną typu char. (char temp = x; char tmp [2] = temp;) ale mówi mi, że mam nieprawidłowy inicjator. Gdzie jest problem? – missjohanna

0

Myślę, że zapomniałeś zainicjować ciąg "str": Musisz zainicjować ciąg przed użyciem strcat. A także potrzebujesz, aby tmp był łańcuchem, a nie pojedynczym znakiem. Spróbuj to zmienić:

char str[1024]; // Only declares size 
char tmp = '.'; 

dla

char str[1024] = "Hello World"; //Now you have "Hello World" in str 
char tmp[2] = "."; 
1

Błąd wynika z faktu, że są przechodzącą źle strcat(). Spójrz na strcat() „s prototypu:

char *strcat(char *dest, const char *src); 

Ale mijają char jako drugi argument, który jest oczywiście błędne.

Zamiast tego użyj snprintf().

char str[1024] = "Hello World"; 
char tmp = '.'; 
size_t len = strlen(str); 

snprintf(str + len, sizeof str - len, "%c", tmp); 

Dalej należy zauważyć OP:

That was just a example with Hello World to describe the Problem. It must be empty as first in my real program. Program will fill it later. The problem just contains to add a char/int to an char Array

W tym przypadku snprintf() poradzi sobie z łatwością "dodaj" typów całkowitych do bufora char też. Zaletą interfejsu snprintf() jest to, że jest on bardziej elastyczny do łączenia różnych typów danych w bufor char.

na przykład do łączenia łańcuch, char i int:

char str[1024]; 
ch tmp = '.'; 
int i = 5; 

// Fill str here 

snprintf(str + len, sizeof str - len, "%c%d", str, tmp, i); 
1

C/C++ ciąg jest tablicą char zakończona bajtu puste ('\0');

  1. Twój ciąg znaków nie został zainicjalizowany.
  2. Musisz łączyć ciągi znaków i próbujesz połączyć pojedynczy ciąg znaków (bez bajtu zerowego, więc nie jest ciągiem znaków) z ciągiem znaków.

Kod powinien wyglądać następująco:

char str[1024] = "Hello World"; //this will add all characters and a NULL byte to the array 
char tmp[2] = "."; //this is a string with the dot 
strcat(str, tmp); //here you concatenate the two strings 

pamiętać, że można przypisać ciąg dosłownego do tablicy tylko podczas deklaracji.
Na przykład poniższy kod nie jest dozwolone: ​​

char str[1024]; 
str = "Hello World"; //FORBIDDEN 

i powinien zostać zastąpiony

char str[1024]; 
strcpy(str, "Hello World"); //here you copy "Hello World" inside the src array 
0

Suggest zastępując w ten sposób:

char str[1024]; 
char tmp = '.'; 

strcat(str, tmp); 

z tym:

char str[1024] = {'\0'}; // set array to initial all NUL bytes 
char tmp[] = "."; // create a string for the call to strcat() 

strcat(str, tmp); // 
+0

To jest rozwiązanie problemu, który podałem jako przykład. Ale powiedziałem, że jest to tablica znaków, a druga to znak. Gdyby było to tylko 2 tablice znaków, nie stanowi to żadnego problemu. W moim głównym programie dostaję char lub int z fgetc. To może działać, jeśli napiszę: char tmp [2]; tmp [1] = fgetc (); ale, nie pewne! – missjohanna

+0

ze względu na modyfikację pytania, możesz spróbować: char newstr [strlen (str) +2] = {'\ 0'}; strcpy (newstr, str); newstr [strlen (newstr)] = tmp; – user3629249