2010-10-24 3 views
1

У меня есть массив символов из массива, вы хотите сохранить буквенно-цифровое строчное значение в массиве указателей. т.е. mystr должен указывать на char [] из «50sometexthere»Копирование альфанумерных символов в C

char[] myline = " 50 Some Text Here "; 
char *mystr = (char *)malloc(128 * sizeof(char)); 

char *tmp = myline; 

while (*tmp != '\0'){ 
if (isalnum(*tmp)) 
    strcat(mystr,(char*) tolower(*tmp)); 
tmp++; 
} 

Что я делаю неправильно?

+0

Какой выход/ошибка вы получаете? –

+0

Не отбрасывайте возвращаемое значение из 'malloc()'. http://c-faq.com/malloc/mallocnocast.html – Tim

ответ

2
char *myline = " 50 Some Text Here "; 
char *mystr = (char *)malloc(128); //sizeof char is always 1 

char *tmp = myline; 
char *tmpdest = mystr; 

while (*tmp != '\0'){ 
if (isalnum(*tmp)) 
    *tmpdest++ = tolower(*tmp); //this line is changed! 
tmp++; 
} 

*tmpdest = '\0'; 

НТН

+0

Спасибо, это отлично работает. Мне нужно разобраться в этих указателях, так как я вижу, что происходит. –

0

Ваша ошибка отлитый в вызове strcat.

почти всегда литая, в C, неправильно

strcat занимает 2 указателя на символ, вы подачи указатель на символ и INT (ошибочно приводится к указателю на символ).

+0

Как бы преобразовать в нижний регистр, не возвращая целое число? –

+0

@Igor K: как вы видите из ответа Армена, вы не используете целое число для строковых функций. Вам нужно найти другой способ (его путь довольно хорош). – pmg

2

Функция tolower возвращает целое число, и вы ошибочно набрасываете его на char *.

Лучший способ сделать это, чтобы скопировать буквенно-цифровые символы из исходного массива в массив назначения

char myline[] = " 50 Some Text Here "; // put the [] after the variable. 
char *mystr = malloc(128); 

char *tmp = myline; 
char *destPtr = mystr; 

while (*tmp != '\0'){ 
if (isalnum(*tmp)) { 
    *destPtr++ = *tmp; 
} 
tmp++; 
} 
*destPtr = 0; // terminating nul character. 

Если вы действительно хотите использовать strcpy, вам необходимо инициализировать строку назначения в пустую строку и сделайте символ скопированным частью массива символов и добавьте этот массив в строку назначения:

char myline[] = " 50 Some Text Here "; // put the [] after the variable. 
char *mystr = malloc(128); 

char *tmp = myline; 
mystr[0] = 0; // initialize the destination string. 
while (*tmp != '\0'){ 
     char str[2] = {0}; // temp string of size 2. 
     if (isalnum(*tmp)) 
       str[0] = tolower(*tmp); // put the char to be copied into str. 
       strcat(mystr,str);  // append. 
     tmp++; 
} 
+0

Спасибо, что объяснили это, имеет смысл. –

+0

Если вы собираетесь использовать этот подход в реальном коде, вам нужно будет убедиться, что вы не переполняете выделенные 128 байтов в 'mystr'. – Tim

+0

@ Тим сделаем, спасибо! –