Strcat присоединить строку к существующей строке. Если строковый массив пуст, он не собирается набирать конец строки ('\0'
), и это вызовет ошибку времени выполнения.
Согласно странице руководства Linux простая strcat реализована следующим образом:
char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
size_t i;
for (i = 0 ; i < n && src[i] != '\0' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = '\0';
return dest;
}
Как вы можете видеть в этой реализации, strlen(dest)
не вернет правильную длину строки, если только dest
не инициализируется, чтобы исправить значения строки c. Вам может повезти иметь массив с первым значением нуля в char stuff[100];
, но вы не должны полагаться на него.
Вот простая функция, чтобы справиться с этим, используя split и replace:
Предполагая, что 'stringlist' является вашим списком строк ...
def transformlist(stringlist):
stringlist = stringlist.split(sep=',')
stringlist[0] = stringlist[0].replace('[','')
stringlist[-1] = stringlist[-1].replace(']','')
return stringlist
Вероятно, наиболее лаконичным способом является использование модуля re
для разделения и удаления символов из строки, а затем рекомбинация строк обратно в структуру данных list
:
import re
s = '[KEYTYPE.FWPROD2KEY, KEYTYPE.FWPROD2KEY, DOWNLOADMODE.FWTOFW, False, DEPLOYMODE.DEPLOY]'
l_str = ''.join(re.split(', [ ]', s))
l = eval(l_str)
или одно- liner:
l = eval(''.join(re.split(', [ ]', s)))
К пунктам Арьи в комментарии , так как у меня нет этих переменных, я не могу это проверить, но тогда вы сможете проверить результат типа list
:
>>> print(type(l))
<type 'list'>
Вы можете использовать .split () , затем getattr () и ast.literal_eval ()
import ast
s = '[KEYTYPE.FWPROD2KEY, KEYTYPE.FWPROD2KEY, DOWNLOADMODE.FWTOFW, False, DEPLOYMODE.DEPLOY]'
def get_val(value):
values = value.split('.')
if values[0] in locals: return getattr(getattr(locals, value), values[1])
if values[0] in globals: return getattr(getattr(globals, value), values[1])
try: return ast.literal_eval(value)
except: return value
#slice the string to get rid of the brackets
#and .replace to remove all spaces
data = [get_val(val) for val in s[1:-1].replace(' ', '').split(',')]
. безопасный способ сделать это.