我正在尝试制作这个程序,以便用户可以键入任何给定的字符串,并且该程序会将字母数字字符与其余字符分开,将它们打印到第二个字符串中,最后将最终结果打印到屏幕上.
我已经尝试过使用 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
最佳答案
scanf
不是正确的方法,特别是如果您的输入可能包含空格,例如 scanf
将停止读取更多输入并且不会存储空格.
您应该使用fgets
,它可以让您根据存储数据的缓冲区来限制输入数据。例如:
fgets(string, STR_SIZE, stdin)
应该可以。
关于大小 - 您应该对字符串的最大大小有一些限制,然后 STR_SIZE 应设置为该数字。它应该是您的计划要求的一部分,或者只是您提出要求时有意义的大小。它必须在读取用户输入之前定义,因为缓冲区内存是在读取之前分配的。
<小时/>关于风格的评论,与您的问题无关 - 始终尝试将代码重复减少到 0。行 alfanmerico[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。
此外,始终在新行中关闭范围。
关于c - 将空格字符读入字符串,其大小由 str_size 确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468974/