Хотя вы никогда не указывали, были ли комментарии достаточными для решения вашей проблемы, если вы все еще боретесь с тем, как получать данные с помощью функции CS50 get_string()
, при этом не гарантируя, что они не содержат пробела , вы можетепросто напишите короткую оболочку для функции get_string()
.
В функции оболочки вы можете просто передать любую подсказку непосредственно в get_string()
, сохранив возврат.Затем выделите вторую строку для хранения содержимого и зациклите строку, возвращенную get_string()
, копируя только непробельные символы в новый блок памяти, обнуляя новую строку после завершения и возвращая новую строку.
Это может быть что-то простое:
#include <cs50.h>
...
/* function using CS50 get_string() to fill input w/o spaces */
string get_str_nospc (string p)
{
size_t ndx = 0; /* index */
string s = get_string (p), /* string returned by get_string() */
sp = s, /* pointer to s (must preserve s address) */
s_nospc = NULL; /* pointer to copy with no whitespace */
if (!s) /* validate get_string() return */
return NULL;
/* allocate/validate storage for string without whitespace */
if (!(s_nospc = malloc (strlen (s) + 1))) {
perror ("malloc-s_nospc");
return NULL;
}
do /* copy s to s_nospc omitting whitespace */
if (!isspace (*sp)) /* if it's not a space - copy */
s_nospc[ndx++] = *sp;
while (*sp++); /* post-increment ensures nul-character copied */
return s_nospc; /* return string with no whitespace */
}
( примечание: вы хотите выделить и скопировать независимо от того, содержит ли строка, возвращаемая get_string()
, пробел в качестве строкивозвращаемый get_string()
освобождается деструктором библиотеки CS50 при выходе. Ваша функция не должна возвращать строку, которая может / может не нуждаться в освобождении на основании условия внутри функции - вы никогда не узнаете, были ли вы ответственны за вызовfree
или нет.)
Коротким примером может быть:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>
/* function using CS50 get_string() to fill input w/o spaces */
string get_str_nospc (string p)
{
size_t ndx = 0; /* index */
string s = get_string (p), /* string returned by get_string() */
sp = s, /* pointer to s (must preserve s address) */
s_nospc = NULL; /* pointer to copy with no whitespace */
if (!s) /* validate get_string() return */
return NULL;
/* allocate/validate storage for srting without whitespace */
if (!(s_nospc = malloc (strlen (s) + 1))) {
perror ("malloc-s_nospc");
return NULL;
}
do /* copy s to s_nospc omitting whitespace */
if (!isspace (*sp)) /* if it's not a space - copy */
s_nospc[ndx++] = *sp;
while (*sp++); /* post-increment ensures nul-character copied */
return s_nospc; /* return string with no whitespace */
}
int main (void) {
string nospc = get_str_nospc ("input : ");
if (nospc) {
printf ("nospc : %s\n", nospc);
free (nospc);
}
}
Пример использования / Вывод
$ ./bin/cs50_getstrnospc
input : my dog has fleas
nospc : mydoghasfleas
Посмотрите на вещии дайте мне знать, если это ваш последний комментарий.Если нет, я с радостью помогу вам.