scanf扫描字符串总结

熟悉的scanf

scanf 是我们学C语言时候最先接触到的,是用来接收输入的.出现的测试题很多都是从一个文件读取,我们就会用到 fscanf 如果用不好,就很麻烦

遇到什么字符结束?

默认是遇到 空格 tab键 换行,就结束一个串的扫描

如果我想要包含空格 tab 怎么办?

使用类似正则表达式的限定字符集合 用方括号括起来在% 和 s 之间 。例如: %[a-z 0-9]s 包含 a-z 空格和0-9 的串

有宽度的字符串如何截取

char buf[20] = {0};
scanf("%5s",buf,6); //6 包含了内容+\0 字符的长度

但是遇到 空格、tab、换行就要停止扫描和%s一样
比如上面例子: 输入 “he is a beautiful man” 就会得到 he

测试用例

使用
scanf
sscanf
fscanf
来作为例子说明一下

#include <iostream>
#include <stdio.h>

void test1()
{
    const int MAX_BUF = 4096;
    char buf[MAX_BUF] = {}; 
    char buf1[MAX_BUF] = {};
    scanf("%s%s",buf,buf1);    
    printf("%s %s\n", buf,buf1);
    FILE* fp = fopen("d:\\test\\input.txt", "r");
    fscanf(fp, "%s%s", buf, buf1);
    printf("%s %s\n", buf, buf1);
}
void test2()
{
    const int MAX_BUF = 4096;
    char buf[MAX_BUF] = {};
    scanf("%[a-z \t0-9]s", buf);
    printf("%s\n", buf);
}
void test3()
{
    const int MAX_BUF = 4096;
    char buf[MAX_BUF] = {};

    FILE* fp = fopen("d:\\test\\input.txt", "r");
    fscanf(fp, "%[a-z \t0-9]s", buf);
    printf("%s\n", buf);
}
void test4()
{
    const int MAX_BUF = 4096;
    char buf[MAX_BUF] = {};
    char buf_input[MAX_BUF] = {"hello   beijing"};
    sscanf(buf_input,"%[a-z \t0-9]s", buf);
    printf("%s\n", buf);

}
void test5()
{
    const int MAX_BUF = 4096;
    char buf[MAX_BUF] = {};
    char buf_input[MAX_BUF] = {"hello   beijingasfaskfj;lasdfj;lasfjdkasfjasldfjdasfjlasfjlfjasjoiweruweroiasdkfjdsjdasf"};
    sscanf(buf_input, "%4096s", buf,4096);
    printf("%s\n", buf);
}
void test6()
{
    const int MAX_BUF = 4096;
    char buf[20] = {};
    scanf("%5s", buf,6);
    printf("%s\n", buf);
}
int main()
{
    test2();
    test3();
    test4();
    test5();
    test6();
}

  • 参考微软的msdn.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言字符串的冒泡排序可以通过比较字符串的ASCII码值来实现。具体步骤如下: 1.定义一个字符串数组,用于存储待排序的字符串。 2.使用嵌套循环,外层循环控制比较的轮数,内层循环控制每轮比较的次数。 3.在内层循环中,比较相邻两个字符串的ASCII码值,如果前一个字符串的值大于后一个字符串的值,则交换两个字符串的位置。 4.重复执行步骤3,直到一轮比较结束。 5.重复执行步骤2和步骤3,直到所有的轮数都执行完毕。 6.输出扫描完第K遍后的中间结果序列。 下面是C语言字符串冒泡排序的代码实现: ```c #include <stdio.h> #include <string.h> void bubble_sort(char str[][100], int n, int k) { int i, j, l; char temp[100]; for (i = 0; i < k; i++) //控制比较的轮数 { for (j = 0; j < n - i - 1; j++) //控制每轮比较的次数 { if (strcmp(str[j], str[j + 1]) > 0) //比较相邻两个字符串的ASCII码值 { strcpy(temp, str[j]); strcpy(str[j], str[j + 1]); strcpy(str[j + 1], temp); //交换两个字符串的位置 } } printf("第%d遍排序结果:\n", i + 1); for (l = 0; l < n; l++) { printf("%s ", str[l]); //输出每轮排序后的结果 } printf("\n"); } } int main() { int n, k; char str[100][100]; printf("请输入字符串的个数和扫描的轮数:\n"); scanf("%d%d", &n, &k); printf("请输入%d个字符串:\n", n); int i; for (i = 0; i < n; i++) { scanf("%s", str[i]); } bubble_sort(str, n, k); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值