牛客网字符/字符串循环输入输出测试——C语言scanf和printf用法

C/C++ 专栏收录该内容
17 篇文章 4 订阅

int类型输入输出格式见博客:牛客网循环输入输出测试——C语言scanf和printf用法

1.题目描述

对输入的字符串进行排序后输出

输入描述:

输入有两行,第一行n

第二行是n个空格隔开的字符串

输出描述:

输出一行排序后的字符串,空格隔开,无结尾空格

#include <stdio.h>
int main()
{
	int n, i;
	scanf("%d", &n);
	char str[100][100];//字符串数组要定义成二维数组
	for (i = 0; i<n; i++)
	{
		scanf("%s", str[i]);
	}
	for (i = 0; i<n - 1; i++)
		for (int j = 0; j<n - 1 - i; j++)
		{
			if (strcmp(str[j],str[j + 1])>0)
			{
				char temp[100];
				strcpy(temp, str[j]);//数组元素交换时用strcpy函数而不是简单的temp=str[j]
				strcpy(str[j], str[j + 1]);//str[j]表示的是地址而不是里面的值
				strcpy(str[j + 1], temp);
			}
		}
	for (i = 0; i<n; i++)
	{
		printf("%s", str[i]);//输入输出时都要用"%s"格式,表示字符串
		printf(" ");
	}
	return 0;
}

 这里我出错的地方在于字符串数组未定义成二维数组,我真是,,而且冒泡排序中值交换时用strcp()函数。

详见这篇博客:C语言中字符串数组排序问题

2.题目描述:对输入的字符串进行排序后输出

输入描述:

多个测试用例,每个测试用例一行。

每行通过空格隔开,有n个字符,n<100

输出描述:

对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

#include<stdio.h>
#include<string.h>
int main()
{
	char str[100][100];
	char s[100];
	int sum;
	sum = 0;
	while (scanf("%s", &str[sum]) != EOF)
	{
		sum++;
		if (getchar()== '\n')//要用getchar()函数判断输入是否为换行
		{
			for (int i = 0; i<sum - 1; i++)//n个数排序n-1趟
				for (int j = 0; j<sum - i - 1; j++)//冒泡排序
				{
					if (strcmp(str[j], str[j + 1])>0)
					{
						char temp[100];
						strcpy(temp, str[j]);
						strcpy(str[j], str[j + 1]);
						strcpy(str[j + 1], temp);
					}
				}
			for (int k = 0; k<sum; k++)
			{
				printf("%s", &str[k]);
				printf(" ");
			}
                        printf("\n");//每行输出要换行!到处都是坑
			sum = 0;
		}

	}
	return 0;
}

3.题目描述:对输入的字符串进行排序后输出

输入描述:

多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100

输出描述:

对于每组用例输出一行排序后的字符串,用','隔开,无结尾空格

思路:输入时以字符串形式读入,对每行字符串用strtok函数进行字符串分割,分割后的元素保存在字符数组中,输出时按照给定的格式输出,注意最后一个没有逗号。

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char s[100];
	char str[100][100] = {""};
	int num;
	while (scanf("%s", s) != EOF)//读入字符串
	{
		num = 0;
		//进行字符串分割
		char *p;
		p = strtok(s, ",");
		while (p!=NULL)
		{
			strcpy(str[num], p);//以逗号分割字符数组,并且将结果存放到str[]中
			num++;
			p = strtok(NULL, ",");
		}
		for (int i = 0; i < num - 1; i++)
			for (int j = 0; j < num - 1 - i; j++)
			{
				if (strcmp(str[j], str[j + 1]) > 0)
				{
					char temp[100];
					strcpy(temp, str[j]);
					strcpy(str[j], str[j + 1]);
					strcpy(str[j + 1], temp);
				}
			}
		for (int k = 0; k < num; k++)
		{
			printf("%s", &str[k]);
			if(k<num-1)
				printf(",");
		}
		printf("\n");

	}
	return 0;
}
			

 总结字符串处理中用到的方法:

所有关于字符串处理函数均要添加头文件#include<string.h>

1.strcpy函数——复制

字符串变量保存的是变量的地址,如果直接用str1=str2会将str2的地址赋给str1,这样达不到将str2的内容赋给str1,正确的方法如下所示,strcpy(string,str1);将str1(这里是用指针指向字符串地址)内容复制给string字符串变量(string用字符数组存放)。

不管是字符数组存放还是指针指向,都是为了获取字符串地址。在调用时取的是地址。这点很重要。

#include <stdio.h>
#include <string.h>

int main(void)
 {
    char string[10];
    char *str1 = "abcdefghi";

    strcpy(string, str1);
    printf("%s\n", string);  // 输出:abcdefghi
    return 0;
 }

2.strcmp函数——字符串比较

用  法: strcmp(str1,str2);//比较字符串1和字符串2的大小,根据首字符在ASCII中的大小
返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
说  明: 它是区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数

可以看到在实际的应用中,strcmp函数通常用来进行字符串排序时的比较大小。

#include <string.h>
#include <stdio.h>

int main(void)
 {
    char *a = "aBcDeF";
    char *b = "AbCdEf";
    char *c = "aacdef";
    char *d = "aBcDeF";
    printf("strcmp(a, b) : %d\n", strcmp(a, b));  // 输出:1
    printf("strcmp(a, c) : %d\n", strcmp(a, c));  // 输出:-1
    printf("strcmp(a, d) : %d\n", strcmp(a, d));  // 输出:0
    return 0;
 }

3. strtok函数—— 根据分界符将字符串分割成一个个片段

用  法: char *strtok(char *s, const char *delim);
返回值: 返回下一个分割后的字符串指针,如果已无从分割则返回NULL
说  明: 当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符;(表示一次调用即可完成分割操作)
       在第一次调用时,strtok()必须赋予参数s字符串,往后的调用则将参数s设置成NULL;

第一次调用时,strtok函数的第一个参数传入要分割的字符串,而第二次以及后面再次调用该函数的时候,strtok函数的第一个参数应该传入NULL,这是因为在strtok第一个参数为NULL的时候,该函数默认使用上一次未分割完的字符串的未分割的起始位置作为本次分割的起始位置,直到分割结束为止。

#include <stdio.h>
#include <string.h>

int main()
{
    char s[] = "ab-cd : ef";
    char *delim = "-: ";
    char *p;
    printf("%s \n", strtok(s, delim));//第一次分割时传入字符串
    // 输出:ab
    while((p = strtok(NULL, delim)))//之后将s替为NULL
        printf("%s ", p);
        printf("\n");
    //继续输出
    //      cd
    //      ef
}
  • 4
    点赞
  • 0
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值