Мне действительно нужна помощь в программировании на C. Я знаю, как выполнить эту задачу на C++, но на этот раз мне нужно сделать это на C.
Объект: Итак, я хочу иметь программу, которая считывала бы строки из stdin, а затем печатала бы их с использованием разных спецификаторов формата.
Проблема : Я пытаюсь читать строки, разделенные «пробелом», и сохранять их в массиве, который позволяет печатать их «отдельно».
Основная проблема здесь в том, что я не знаю, как их хранить, как в C++, например. есть массив, затем вы храните их как str[i] == str_read
и используете cout << str[i]<<endl
для печати.
Если мы прочитаем строку шестнадцатеричных чисел и выведем как ASCII
Вход будет выглядеть так: 0x72 0x6f 0x6c
На выходе будет r o l
.
редактировать :
Я получил этот код из Интернета, который мог читать всю строку. Мне нужно вытащить эти строки, такие как "0x72" "0x6f"
, и поместить их в массив отдельно.
#include <stdio.h>
#include <stdlib.h>
int input(char *s, int length);
int main()
{
char *buffer;
size_t bufsize = 32;
size_t characters;
buffer = (char *)malloc(bufsize * sizeof(char));
if (buffer == NULL)
{
perror("Unable to allocate buffer");
exit(1);
}
printf("Type something: ");
characters = getline(&buffer, &bufsize, stdin);
printf("%zu characters were read.\n", characters);
printf("You typed: '%s'\n", buffer);
return(0);
}
вам нужен цикл, чтобы продолжать принимать ввод
"хранить их в массиве" в показанном коде нет, даже не пытается.
Вы правы, этот код не имеет отношения к этой проблеме. не могли бы вы опубликовать несколько примеров того, как «зацикливаться, чтобы продолжать принимать ввод» в C или ссылках, если это возможно? это действительно сбивает с толку.
Не по теме для этого вопроса, но не используйте scanf_s
или printf_s
. Они не безопаснее стандартных функций scanf()
и printf()
, и их нельзя переносить. Согласно open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm: «Microsoft Visual Studio реализует раннюю версию API-интерфейсов. Однако реализация является неполной и не соответствует ни C11, ни исходному TR 24731-1. ... В результате многочисленных отклонений от спецификации Microsoft реализация не может считаться соответствующей или переносимой ".
Если вопрос заключается в синтаксическом анализе подстрок, разделенных пробелами, из строки, рассмотрите возможность использования strtok()
или strtok_r()
.
И не используйте результат malloc
и друзей или void *
в целом. Также sizeof(char)
бесполезен, это не может быть ничего, кроме 1
)
относительно: buffer = (char *)malloc(bufsize * sizeof(char)); if (buffer == NULL) { perror("Unable to allocate buffer"); exit(1); }
все это можно заменить на char *buffer = NULL;
в качестве функции POSIX: getline()
всегда выполняет свое собственное распределение памяти
Возвращаемый тип из getline()
- ssize_t
, который является значением со знаком, поэтому спецификатор формата %zu
неверен. Кроме того, код должен проверять возвращаемое значение (> 0), чтобы убедиться, что операция прошла успешно.
Спасибо за помощь
Оберните петлю вокруг сканера и принтера.