Как разбить строку на c? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь разделить строку на две части, используя пробел в качестве разделителя. Я пробовал приведенный ниже код, но получил неверный результат.

#include <stdio.h>
#include <string.h>
void main()
{
    char str_1[5], str_2[5], my_str[] = "hello world";

    //storing hello in str_1.
    for (int i = 0; i <= 4; ++i)
        str_1[i] = my_str[i];
    puts(str_1);

    //storing world in str_2.
    for (int i = 6, j = 0; i <= 10; ++i, ++j)
        str_2[j] = my_str[i];
    puts(str_2);
}

Ожидаемый результат:

hello
world

Получение вывода:

hello
worldhello

Ответы [ 4 ]

0 голосов
/ 27 мая 2020

В коде есть некоторые основные c ошибки. Просьба от go до c изучать связанные теории. пожалуйста, go через код и комментарии.

  • начало всегда должно заканчиваться '\ 0' (нулевым символом).
  • размер массива символов всегда должен быть +1 строки.
#include <stdio.h>
#include <string.h>
void main()
{
    /* array side should be (staring size + 1) here 1 is for staring terminator ('\0') */
    char str_1[6], str_2[6], my_str[] = "hello world";
    int i =0, j =0;
    //storing hello in str_1.
    for (i = 0; i <= 4; ++i)
        str_1[i] = my_str[i];
    /* You need to add null terminator ('\0') at the end of the staring so that we can print it properly */
    str_1[i] = '\0';
    puts(str_1);

    //storing world in str_2.
    for (i = 6, j = 0; i <= 10; ++i, ++j)
        str_2[j] = my_str[i];
    /* You need to add null terminator ('\0') at the end of the staring so that we can print it properly */
    str_2[j] = '\0';
    puts(str_2);
}

0 голосов
/ 27 мая 2020

str_1 и str_2 - это массивы символов, и способ заполнения данных подходит. Но когда вы используете метод puts(), вы должны отметить конец строки символом '\0', как описано в этой ссылке http://www.cplusplus.com/reference/cstdio/puts/

Функция начинается копирование с указанного адреса (str), пока не достигнет завершающего нулевого символа ('\ 0'). Этот завершающий нулевой символ не копируется в поток.

Таким образом, вам нужно добавить еще одно место в str_1 и str_2 для завершающего нуля символа:

char str_1[6], str_2[6], my_str[] = "hello world";

Затем, скопировав подстроки в эти массивы, поместите '\ 0' сразу после последнего скопированного символа, например:

//storing hello in str_1.
int i;
for (i = 0; i <= 4; ++i) {
    str_1[i] = my_str[i];
}

str_1[i] = '\0';
0 голосов
/ 27 мая 2020

Другой простой пример, например, использование strtok () :

Сначала убедитесь, что в переменных достаточно места для задачи:

 //char str_1[5], str_2[5], my_str[] = "hello world";//need minimum of 6 for each 5 char word
 //           ^         ^
 char str_1[6], str_2[6], my_str[] = "hello world";
 //         ^         ^      
 char *tok = strtok(my_str, " ");
 if(tok)
 {
     strcpy(str_1, tok);
     tok = strtok(NULL, " ");
     if(tok)
     {
         strcpy(str_2, tok);//Note - strcpy terminates target with NULL.
     }
 }
0 голосов
/ 27 мая 2020

Вы должны завершить строку, используя \0, используя нулевой символ в качестве последнего символа строки. Попробуйте следующий код.

#include <stdio.h>
#include <string.h>
void main()
{
    char str_1[6], str_2[6], my_str[] = "hello world";

    //storing hello in str_1.
    for (int i = 0; i <= 4; ++i)
        str_1[i] = my_str[i];

    str_1[5] = '\0';
    puts(str_1);

    //storing world in str_2.
    for (int i = 6, j = 0; i <= 10; ++i, ++j)
        str_2[j] = my_str[i];

    str_2[5] = '\0';
    puts(str_2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...