2015-02-06 6 views
0

Im new to C и i сталкиваются с проблемой использования strcat(). Я посмотрел на strcat и заметил, что он принимает строку как аргументы, но когда я разделяю элементы из массива char, это символ, и когда я использую его как аргумент для strcat, он выводит ошибку.Как нарисовать символ на строку в C?

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
char a[10]="abcdefg123"; 
char *pa=a; 
char *out[2]={"",""}; 
int counter=0; 
while(*pa != '\0'){ 
    if (counter%2==0){ 
     strcat(out[0],*pa); 
    } 
    else{ 
    strcat(out[1],*pa); 
    } 

    counter++; 
    pa++;  
    } 
printf("%s,%s\n",out[0],out[1]); 

return 0; 
} 

цель кода, чтобы разбить строку на две строки, каждая из которых содержит все символы в нечетной позиции или даже position.However, когда им Тринг разыменования указателя полукокса все я получаю это Char, но кажется мне нужна строка

+0

Если 'out' содержит две пустые строки, как вы можете добавить в систему с [' strcat'] (http://linux.die.net/man/3/strcat) без выделения больше памяти? – crashmstr

+0

'out' инициализируется, чтобы указать на литералы, и запись в эту область памяти (даже если она была достаточно большой) является незаконной как в C, так и в C++. –

+0

«string» означает «char' array с нулевым завершением». –

ответ

2

Используйте временную строку в strcat вместо strcat(out[0],*pa);.

Кроме того, убедитесь, что вы выделили достаточно памяти для out.

int main() 
{ 
    char a[10]="abcdefg123"; 
    char temp[2] = {0}; 
    char *pa=a; 

    // This is not good for `strcat`. 
    // char *out[2]={"",""}; 

    // Use this instead. 
    char out[2][20]={"",""}; 

    int counter=0; 
    while(*pa != '\0'){ 
     temp[0] = *pa; 
     if (counter%2==0){ 
     strcat(out[0], temp); 
     } 
     else{ 
     strcat(out[1], temp); 
     } 

     counter++; 
     pa++;  
    } 
    printf("%s,%s\n",out[0],out[1]); 

    return 0; 
} 
+0

sry, я вопрос для строки char temp [2] = {0}; что представляет собой 0, и если u do temp [0] = * pa, что произойдет с 0 – user3417260

+0

'char temp [2] = {0};' создает массив символов и устанавливает все элементы этого массива в ' 0'. 'temp [0] = * pa;' устанавливает первый элемент массива в '* pa' и оставляет второй элемент в' 0'. Это заставляет массив вести себя как строка с нулевым завершением. –

+0

char * pa = a; В чем смысл? – nikaltipar

0

точки 1. в соответствии с man page из strcat()

. .. строка dest должна иметь достаточно места для результата.

Пункт 2. Второй аргумент для strcat() является const char *, так что вызов не может быть strcat(out[0],*pa);. Для этого вам нужно использовать временный массив, который будет содержать только значение *pa. В противном случае, вы можете использовать strncat() как

strncat(out[0], pa, 1); // copy only 1 char 

В последнем случае вам не нужно иметь какой-либо временный массив.

Ссылка: От страницы человека, опять же,

strncat() функция аналогична, за исключением того, что он будет использовать в большинстве n байтов из src и src не должен быть нулевым байтом, если он содержит n или больше байтов.

0

У strcat() требуется указатель на строку с нулевым символом. Вы разыскиваете указатель (с помощью оператора *), который дает символ. Вы не можете просто нарисовать символ указателю на укус. Возможно, вы захотите использовать memcpy() вместо strcat(), но для копирования одиночных байтов простое назначение с использованием * операторов на левой и правой сторонах будет хорошо. Но, как указывали другие, ваш код не выделяет пространство для копирования символов, поэтому вам нужно будет внести дополнительные изменения, чтобы исправить это. Кроме того, вам придется не забудьте скопировать конечный нулевой байт в конец обеих строк вывода.

0

В C «строка» - это просто указатель на персонажа; строка пробегает от этого символа до конечного 0 байта (NUL).

Если вы разыщите указатель на строку, вы получите символ в этом положении. Если указатель указывает на начало строки, вы получаете первый символ строки.

У вашей программы есть некоторые проблемы. Во-первых, вам нужно выделить пространство для новых строк. strcat() попытается скопировать символы, где бы вы ни говорили, но это ваша работа, чтобы убедиться, что там есть место и что там можно писать.Объявление out просто объявляет два указателя и инициализирует их, указывая на константную строку нулевой длины. Вместо этого вам нужно выделить память, что-то вроде:

char out0[64], out1[64]; 
char *out[]={out0, out1}; 

Это делает два выходных буферов 64 символов в каждой, затем устанавливает out с указателями на них.

Другая проблема: вы указали длину 10 для вашего массива символов, но затем вы инициализируете ее длиной в 10 строк. Это означает, что нет места для завершающего байта NUL, а C не будет помещать его. Затем strcpy() или strcat() скопирует лишний мусор из строки, пока не появится байт NUL. Если вам повезет, сразу будет один, и вы не заметите ошибку, но если вам не повезет, вы получите странный мусор.

Просто позвольте компилятору подсчитать, сколько байтов в вашей строке и делать правильно. Оставьте вне длина:

char a[]="abcdefg123"; 
Смежные вопросы