我正在尝试制作该程序,以便用户可以键入任何给定的字符串,并且该程序会将字母数字字符与其余字符分开,将它们打印成第二个字符串,最后将最终结果打印到屏幕上
我已经尝试过使用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
答案 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位置进行操作。
此外,请始终关闭换行符。