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
}