Копирование символов из строки(C)
Написал функцию, в которой сначала вводится время в часах, минутах и секундах через ":" в строку str(например 02:16:10). Затем символы обозначающие каждый отдельный показатель времени копируются в соответствующую строку(h, min и sec). Затем каждая строка, в которую были скопированы символы выводится на экран. Но код не работает, строки h, min и sec не выводятся. Подскажите, в чём ошибка.
void input()
{
char str[8];
gets(str);
puts(str);
int i = 0;
char h[2], min[2], sec[2];
while (str[i] != ':')
{
strncpy(h, str[i],1);
i++;
}
i++;
puts(h);
while (str[i] != ':')
{
strncpy(min, str[i],1);
i++;
}
i++;
puts(min);
while (str[i] != '/0')
{
strncpy(sec, str[i],1);
i++;
}
puts(sec);
}
Ответы (3 шт):
Строка в конце должна завершаться символом '\00' (не '/0') и строки должны иметь размеры, включающие этот символ.
Циклы копирования копируют всю строку в одно место одну букву. Надо смещать целевое место на одну букву и используя функцию strncpy передавать аргументом не одну букву, а адрес строки.
Со всеми исправлениями и проверкой вроде пашет :
#include <stdio.h>
#include <string.h>
void input(){
char str[9]="12:34:56";
//fgets(str,9,stdin);
puts(str);
int i = 0;
char h[3], min[3], sec[3];
int j=0;
while (j<2 && str[i] != ':')
{
strncpy(h+ j ,& str[i],1);
// или
// h[j]=str[i];
i++;
++j;
}
i++;
h[2]='\00';
puts(h);
j=0;
while (j<2 && str[i] != ':')
{
strncpy(min+ j , & str[i],1);
// или
// min[j]=str[i];
i++;
++j;
}
i++;
min[2]='\00';
puts(min);
j=0;
while (j<2 && str[i] != '\00')
{
strncpy(sec+ j , & str[i],1);
// или
// sec[j]=str[i];
i++;
++j;
}
sec[2]='\00';
puts(sec);
}
int main(){
input();
}
Получилось через strtok.
#include <stdio.h>
#include <string.h>
void input();
int main()
{
input();
return 0;
}
void input()
{
char str[9] = "20:16:10", *context = NULL;
char* str2 = strtok_s(str, ":",&context);
printf("%s\n", str2);
char h[3] = "\0", min[3]="\0", sec[3]="\0";
while (str2)
{
printf("%s\n", str2);
strcpy_s(h, 3, str2);
str2 = strtok_s(NULL, ":", &context);
printf("%s\n", str2);
strcpy_s(min, 3, str2);
str2 = strtok_s(NULL, ":", &context);
printf("%s\n", str2);
strcpy_s(sec, 3, str2);
str2 = strtok_s(NULL, ":", &context);
}
printf("%s\t%s\t%s\t", h, min, sec);
}
sscanf позволяет решать подобные задачи более кратко:
#include <stdio.h>
#include <string.h>
int
main (int ac, char *av[])
{
char str[9] = "20:16:10";
char h[3] = "hh", min[3] = "mm", sec[3] = "ss";
int rc;
if ((rc = sscanf(str, "%2s:%2s:%2s", h, min, sec)) == 3)
printf("%s\t%s\t%s\t", h, min, sec);
else
printf("'%s = %s:%s:%s' -- format error in (or just before) field %d\n",
str, h, min, sec, rc);
return puts("End") == EOF;
}