将空格字符读入字符串,其大小由str_size

时间:2019-06-05 22:45:06

标签: c

我正在尝试制作该程序,以便用户可以键入任何给定的字符串,并且该程序会将字母数字字符与其余字符分开,将它们打印成第二个字符串,最后将最终结果打印到屏幕上

我已经尝试过使用scanf ("%[^\n]%*c", string);,但是它似乎没有用,因为事先没有指定字符串的大小,而是由STR_SIZE定义了字符串的大小。

char string[STR_SIZE];

printf("please type in a string \n");
scanf("%s", string);
printf("string: \n %s \n", string);
int size = (strlen(string));
char alfanumerico[STR_SIZE];
int count = 0;
int count2 = 0;

while(count <= size)
{
    if(string[count] >= '0' && string[count] <= '9')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] >= 'a' && string[count] <= 'z')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] >= 'A' && string[count] <= 'Z')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] ==' ')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    count++;
}

printf("alphanumerical characters typed: \n %s \n", alfanumerico);

鉴于用户键入了一个字符串,例如:-=-=[[][][]}}Hello 123 ```//././.

我希望输出为:Hello 123

1 个答案:

答案 0 :(得分:1)

scanf并非可行之道,尤其是如果您的输入内容可能包含空白,而scanf会在该空白处停止读取更多输入内容,并且不会例如存储空格。

您应该使用fgets,它可以根据输入数据存储在其中的缓冲区来限制输入数据。类似这样:

fgets(string, STR_SIZE, stdin)

应该工作。

关于大小-您应该对字符串的最大大小有一些限制,然后将STR_SIZE设置为此数字。它应该是程序要求的一部分,或者只是在满足要求时才有意义的大小。必须在您从用户读取输入之前对其进行定义,因为缓冲存储器是在读取之前分配的。


关于样式的评论,与您的问题无关-始终尝试将代码重复减少到0。行alfanumerico[count2] = string[count]; count2++;在您的代码中出现4次。具有完全相同功能的更优雅的最小if语句将是:

if ((string[count] >= '0' && string[count] <= '9') ||
    (string[count] >= 'a' && string[count] <= 'z') ||
    (string[count] >= 'A' && string[count] <= 'Z') || 
    (string[count] == ' '))
{
    alfanumerico[count2] = string[count];
    count2++;
}

甚至更简单:

char c = string[count];
if ((c >= '0' && c <= '9') ||
    (c >= 'a' && c <= 'z') ||
    (c >= 'A' && c <= 'Z') || 
    (c == ' '))
{
    alfanumerico[count2] = c;
    count2++;
}

它也更具可读性和可维护性-如果要将变量count更改为i,请在一个位置而不是8位置进行操作。

此外,请始终关闭换行符。