Я полагаю, вы пытаетесь скопировать "455" в first
и "747" в second
? Если это так, вы не выделили достаточно места для этого. char first[] = {'0', '\0'}
выделяет только массив размером 2; вам понадобится 4. То же самое для second
.
Вы пытаетесь решить слишком много задач на одном уровне, выясняя, где вы находитесь в исходной строке и , пытаетесь ли вы скопировать в first
или second
и отслеживание длины каждой подстроки; это усугубляет вашу путаницу и делает проблему более сложной, чем она должна быть.
Начните с разделения проблем: вам нужна одна функция, чтобы найти следующую подстроку в вашем вводе, и другая, чтобы скопировать эту подстроку в место назначения.
Честно говоря, лучший способ разбить строку - это использовать любую из стандартных библиотечных функций strtok
, strchr
или strcspn
и использовать strcpy
или strncpy
для копирования подстроки. к массивам назначения. Есть много очень веских причин , а не , чтобы использовать strtok
, но это один из самых простых способов сделать то, что вы ищете.
Вот общая процедура использования strtok
:
char *token = strtok(asshat, ","); // return a pointer to the substring
// before the first comma
while (token)
{
strcpy(destination[i++], token); // assumes destination exists and is
// large enough to hold the token contents
token = strtok(NULL, ","); // find the next substring in the sequence;
// pass NULL to indicate you're continuing
// in the same string
}
Как я упоминал выше, есть причины, по которым не хотите использовать strtok
. Он изменяет входную строку (заменяет разделитель на 0), поэтому вы не можете использовать его для строкового литерала. Вы также можете сохранить исходную строку. Кроме того, strtok
не является ни реентерабельным, ни поточно-ориентированным.
Применяя его к вашему конкретному случаю, вы можете сделать что-то вроде:
#include <stdio.h>
#include <string.h>
int main(void)
{
char asshat[] = "455,747";
char first[4] = "";
char second[4] = "";
char *destination[] = {first, second, NULL};
size_t i = 0;
char *token = strtok(asshat, ",");
while (token && destination[i]) // continue while we get a token AND
{ // there's a place to save it
strcpy(destination[i++], token);
token = strtok(NULL, ",");
}
printf("first = %s\n", first);
printf("second = %s\n", second);
return 0;
}