C char to string (передача char в strcat ()) - PullRequest
5 голосов
/ 27 февраля 2010

Моя проблема в преобразовании символа в строку, я должен передать 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;
}

Ответы [ 4 ]

5 голосов
/ 27 февраля 2010

Поскольку 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;
}
3 голосов
/ 27 февраля 2010

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 инициализируется нулевым терминатором в конце, иначе этот пример завершится неудачей.

И в качестве отступления: подумайте о том, что делает *in++;.Он будет увеличивать in и разыменовывать его, что аналогично in++, поэтому * бесполезен.

2 голосов
/ 27 февраля 2010

Чтобы взглянуть на ваш код, я могу сделать несколько указаний по отношению к нему, это не критика, примите это с щепоткой соли, которая позволит вам стать лучшим программистом 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;
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 02 февраля 2014

Чтобы преобразовать символ в строку с нулевым символом в конце, вы можете просто сделать:

char* ctos(char c)
{
    char s[2];
    sprintf(s, "%c\0", c);
    return s;
}

Рабочий пример: http://ideone.com/Cfav3e

...