2016-07-28 6 views
-1

Мне нужно положить строку в другую без \ 0, я пробовал много способов, но строка всегда грязная.Скопируйте строку в другую без 0

char string[100]; 
int pos=0; 

fgets(string, 99, stdin); 
len = strlen(string); 
printf("%d\n", len); 
char array[len-1]; 

for(pos=0; pos<(len-1); pos++) 
    { 
     array[j]=string[pos]; 
     j++; 
    } 

printf("%s", string); 
printf("%s", array); 

В терминале у меня есть: собака собаки (ENTER) 10 (ENTER) собака собаки (ENTER) собака собаки @

Я также судимый удалить \ 0, используя другой символ, но не может видеть '\ 0' или '\ n', помогите мне PLZ!

+0

Итак, вы удаляете нулевой ограничитель из строки, а затем печатаете его как строку с нулевым завершением ......? – LPs

+0

Просто указывая => 'fgets (string, 99, stdin);' ** - >> ** 'fgets (string, 100, stdin);', 'fgets' позаботится' '\ 0''. – ameyCU

+0

@ameyCU, где вы получили 'scanf()'? –

ответ

2

Передача указателя на то, что не является строкой с нулевым символом, до %s без спецификации длины будет вызывать неопределенное поведение. Вы должны указать длину для печати, если по какой-то причине вы ненавидите завершение нулевого символа.

Попробуйте это:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    int len; 

    char string[100]; 
    int pos=0; 

    fgets(string, 99, stdin); 
    len = strlen(string); 
    printf("%d\n", len); 
    char array[len]; 

    for(pos=0; pos<len; pos++) 
     { 
     array[pos]=string[pos]; 
     } 

    printf("%s", string); 
    printf("%*s", len, array); 

    return 0; 
} 
+0

Привет! Спасибо за Ваш ответ.Мне нужно удалить \ 0, потому что я должен токенизировать строку, а \ 0 дает мне много проблем с последним токеном. Но это не работает таким образом. – Nina06

+0

@ Nina06 Тогда токенизатор должен быть неправильным, потому что строки в C представлены как массивы символов с завершающим нулевым символом. – MikeCAT

+0

@ Nina06 Или вы имеете в виду буквально два символа \ и 0 на '\ 0', а не символ, символ которого равен 0? – MikeCAT

0

TL; DR Вы не хотите нуль-терминатор, отлично. Наряду с этим вы должны быть готовы отказаться от тех свойств, которые присутствуют с нулевым терминатором. Вы больше не можете использовать array как строка.


Разрабатывать, в вашем коде, ваш массив array не оканчивается нулем, поэтому он не может быть использован в качестве строки. формат %s спецификатор ожидает указатель на нуль-терминатором char массива (в общем, строку)

Таким образом, в вашем коде,

printf("%s", array); 

вызывает undefined behavior идя мимо выделенной памяти в поиск нуль-терминатор.

Вы можете, однако, напечатать элемент по элементу, используя петлю for.

+0

Спасибо за ваш ответ! Я действительно не знаю, как это сделать, прямо сейчас, потому что я должен токенизировать строку ... конечно без \ 0 !!!!!! – Nina06

+0

@ Nina06 Я боюсь, что в этом случае вам нужно свернуть собственный синтаксический анализатор, а стандартным - массив с нулевым завершением. –

+0

«однако, напечатайте элемент по элементу с помощью цикла for». -> Может использовать 'printf ("% * s ", len, array);' – chux

0

Копирование без нуль-терминатор использовать memcpy(myCharArray, string, strlen(string)); (предполагается, что размер myCharArray является sucfficient). Чтобы распечатать результат, вам нужно использовать цикл вместо printf.

+0

Hmmm «Чтобы распечатать результат, вам нужно использовать цикл вместо printf». -> возможно 'printf ("% * s ", len, array);' – chux