моя проблема находится в преобразовании символ для строкового представления, я должен передать 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;
}
Поскольку ok
указывает на неинициализированный массив символов, все это будут значения мусора, поэтому если объединение (по strcat
) будет запускаться неизвестно. Также strcat
принимает C-строку (т.е. массив символов, который заканчивается символом '\ 0'). Предоставление char a [200] = ""
даст вам [0] = '\ 0', затем от [1] до [199], установленного на 0.
Изменить: (добавлена исправленная версия кода)
#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;
}
Чтобы взглянуть на ваш код, я могу сделать пару указателей относительно него, это не критика, отнеситесь к этому с долей скепсиса, что позволит вам стать лучше программистом на C:
strcat
. asd
! char
, который не инициализирован должным образом. #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; }
Надеюсь, это поможет, С уважением, Том.
strcat
не будет добавлять отдельные символы. Вместо этого требуется const char *
(полная строка в стиле C), которая добавляется к строке в первом параметре. Итак, ваша функция должна выглядеть примерно так:
char *asd(char* in, char *out)
{
char *end = out + strlen(out);
do
{
*end++ = *in;
} while(*in++);
return out;
}
Цикл do-while будет включать нулевой терминатор, который необходим в конце строк в стиле C. Убедитесь, что ваша строка out инициализирована нулевым символом конца в конце, иначе этот пример не удастся.
И в качестве отступления: подумайте о том, что делает * в ++;
. Он будет увеличивать в
и разыменовывать его, что очень похоже на в ++
, поэтому *
бесполезно.