1、 使用 scanf 和 %[^\n]
该格式说明符会读取整行输入,直到遇到换行符(\n
),包括空格。
#include <stdio.h> int main() { char input[100]; // 用于存储输入的字符数组 printf("请输入一段带空格的字符串: "); scanf("%[^\n]", input); // 读取到换行符之前的所有内容 printf("你输入的是: %s\n", input); return 0; }
2、清理输入缓冲区
有时候需要清理输入缓冲区,以避免残留的换行符导致问题。在读取输入前,可以使用以下代码清理缓冲区,
#include <stdio.h> void clear_input_buffer() { int ch; while ((ch = getchar()) != '\n' && ch != EOF); } int main() { int number; printf("Enter a number: "); if (scanf("%d", &number) != 1) { printf("Invalid input! Clearing buffer...\n"); clear_input_buffer(); } else { printf("You entered: %d\n", number); } printf("Enter another input: "); clear_input_buffer(); // 确保缓冲区已清空 char str[50]; fgets(str, sizeof(str), stdin); // 使用 fgets 读取剩余输入 printf("You entered: %s", str); return 0; }
3、使用 fgets 替代 scanf
相比于 scanf
,fgets
通常是更好的选择,特别是当需要处理带空格的输入时。fgets
还能更好地处理换行符和缓冲区溢出。
#include <stdio.h> int main() { char input[100]; // 用于存储输入的字符数组 printf("请输入一段带空格的字符串: "); fgets(input, sizeof(input), stdin); // 读取整行输入 printf("你输入的是: %s", input); return 0; }
4、使用占位符跳过空白字符
如果将 scanf
与 %s
结合使用,可以在 %s
前添加一个空格来忽略前导空白字符。
#include <stdio.h> int main() { char input1[50], input2[50]; printf("请输入两个用空格分隔的字符串:\n"); scanf(" %s %s", input1, input2); // 在 %s 前加空格跳过前导空白 printf("第一个字符串: %s\n", input1); printf("第二个字符串: %s\n", input2); return 0; }
5、直接使用 getline (POSIX 标准)
如果使用的是支持 POSIX 标准的编译器,可以直接使用 getline
,
#include <stdio.h> #include <stdlib.h> int main() { char *input = NULL; size_t len = 0; printf("请输入带空格的内容:\n"); getline(&input, &len, stdin); // 动态分配内存读取一行 printf("您输入的是:%s", input); free(input); // 用完后释放内存 return 0; }