c - 将空格字符读入字符串,其大小由 str_size 确定

标签 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

最佳答案

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/

相关文章:

c - 为什么 scanf() 函数不等待我在下面代码的最后输入 char

c - 使用 fstat 确定文件类型

c 程序 unsigned int 或 uint8_t

c - C 中将正值四舍五入到小数点后 2 位

c - 使用 VS Code 调试 C 子进程

c - 使用C中的宏为t数组赋值

c - 一个数的质因数

c - 我的库应该处理错误指针输入的 SIGSEGV 吗?

c - 优雅的错误检查

c++ - 无法使用 libssh2 进行编译