2013-05-26 2 views
1

Посмотрите следующий код:Почему 001 добавляется, когда strcat вызывается

char chs[100] = "Hello World"; 
char token[100]; 
int pos = -1; 
while((current = chs[++pos]) != '"'){ 
     strcat(token, &current); 
} 

Но выход:

H\001e\001l\001l\001o\001 \001W\001o\001r\001l\001d 

Любые идеи?

+0

@mbratch Выход должен быть Hello World – Foredoomed

+0

@Foredoomed Вы пытаетесь лишить цитаты вокруг строкового литерала? Кавычки на самом деле не являются частью строки для начала! Возможно, вам стоит начать читать [книгу] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list). – Praetorian

+0

@Foredoomed, но предполагается ли это, что это строковая копия с 'chs' на' token'? Если это так, то для этого используется 'strcpy'. Вы просто делаете 'strcpy (токен, chs);' и делаете это. Никакой цикл не требуется. Или какая-то другая цель? Если вы хотите использовать 'strcat', для этого требуется, чтобы оба строковых параметра были нулевыми. Поэтому вам, по крайней мере, нужно было бы установить токен [0] = '\ 0'' для начала до цикла, как я уже упоминал. – lurker

ответ

2

strcat() нуждается в строке с завершающим нулем, как это вход. поэтому strcat (токен, & current) начнет чтение по адресу current и продолжит работу, пока не найдет нуль. Просто случайно, что у вас в памяти после текущего было «\ 001», поэтому каждый раз, когда вы делали strcat, он копировал все это в токен.

Вы должны сделать char current [] = "\ 0 \ 0", а затем назначить его текущим [0] = chs [++ pos]. Таким образом, ток всегда будет иметь нулевое завершение.

2

Вы Неопределенное поведение

Поскольку ваш current не объявлена, я предполагаю, что это какой-то неинициализированным характер. Ваш current = chs[++pos]) устанавливает символ, но strcat(token, &current); хочет current быть строкой, поэтому вы получаете некоторый бачок, сохраненный после переменной current. Пожалуйста, пост больше вашего образец кода для дальнейшего анализа

BTW '"' выглядит неправильный C

0

Making минимальные изменения это рабочая версия кода:

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

int main() 
{ 
    char current[2] = { 0x0, 0x0 }; // Will be null terminated 
    char chs[100] = "Hello World"; 
    char token[100] ; 
    int pos = -1; // Destination of strcat must also be null terminated 

    token[0] = '\0' ; 

    // String literals does not actually have " in memory they end in \0 
    while((current[0] = chs[++pos]) != '\0') 
    { 
      strcat(token, &current[0]); // Take the address of the first char in current      
    } 

    printf("%s\n", token) ; 

    return 0 ; 
} 

strcat ожидает источник и место назначения будет нулем строки. В вашем случае это выглядит как current только что закончил с \001, за которым следует нулевой терминатор после него в памяти.

Смежные вопросы