Training4:字元串訓練
1. 題目: 請編寫一個C函數,該函數将一個字元串逆序
#include<stdio.h>
#include<string.h>
#define N 50
void strRev(char *s)
{
char temp;
char *end = s + strlen(s) - 1;
while (end > s)
{
temp = *s;
*s = *end;
*end = temp;
--end;
++s;
}
}
int main()
{
char s[N];
printf("Enter string!\n");
fgets(s,N,stdin);
strRev(s);
printf("The strRcv string!");
puts(s);
return 0;
}
2. 題目: 請編寫一個C函數,該函數可以實作将一個整數轉為任意進制的字元串輸出
#include <stdio.h>
int fun2(int num);
int fun16(int num);
int fun8(int num);
int main()
{
int num,kind;
printf("Enter the number : \n");
scanf("%d",&num);
printf("what kind of number do you want to change(2 or 16 or 8) :\n");
scanf("%d",&kind);
if(kind == 2)
{
fun2(num);
}
else if(kind == 16)
{
fun16(num);
}
else if(kind == 8)
{
fun8(num);
}
else
{
printf("error!\n");
}
return 0;
}
int fun2(int num)
{
int s[32] = {0};
int i,n = 0;
while(num != 0)
{
s[n++] = num % 2;
num = num / 2;
}
printf("二進制數為 :");
for(i = n - 1;i >= 0;i--)
{
printf("%d",s[i]);
}
printf("\n");
return 0;
}
int fun16(int num)
{
int s[32] = {0};
int i,n = 0;
while(num != 0)
{
s[n++] = num % 16;
num = num / 16;
}
printf("十六進制數為 :");
for(i = n - 1;i >= 0;i--)
{
printf("%d",s[i]);
}
printf("\n");
return 0;
}
int fun8(int num)
{
int s[32] = {0};
int i,n = 0;
while(num != 0)
{
s[n++] = num % 8;
num = num / 8;
}
printf("八進制數為 :");
for(i = n - 1;i >= 0;i--)
{
printf("%d",s[i]);
}
printf("\n");
return 0;
}
3. 題目: 輸入一個字元串,計算字元串中子串出現的次字數
#include <stdio.h>
#include <string.h>
void main()
{
char str1[20], str2[20], *p1, *p2;
int sum=0;
printf("Please enter two strings\n");
scanf("%s%s", str1, str2);
p1=str1;
p2=str2;
while(*p1 != '\0')
{
if(*p1 == *p2)
{
while(*p1 == *p2 && *p2 != '\0')
{
p1++;
p2++;
}
}
else
p1++;
if(*p2 == '\0')
sum++;
p2=str2;
}
printf("%d", sum);
getchar();
}
4. 題目: 編寫一個C函數,将”I am from shanghai ”倒置為”shanghai from am I”,即将句子中的單詞位置倒置,而不改變單詞内部結構.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int len = 0;
char *temp;
char *str[] = { "I", "am","from","shanghai" ,NULL};
while (str[i] != NULL)
{
i++;
len++;
}
for(i = 0, j = len - 1; j > i; i++,j--)
{
temp =*(str+i);
*(str+i) = *(str+j);
*(str+j) = temp;
}
for(i = 0; i < len; i++)
{
printf("%s ", *(str+i));
}
printf("\n");
return 0;
}
5. 題目: 輸入一個字元串,同時輸入幀頭和幀尾(可以是多個字元),将該字元串中合法的幀識别出來.
提示:幀頭和幀尾分别是head和tail 字元串”asdheadhauboisoktail”中headhauboisoktail是合法幀
#include <stdio.h>
#include <string.h>
int main()
{
char s[100];
char str1[100];
char str2[100];
printf("Please enter your string:\n");
gets(s);
printf("Please enter the frame head:\n");
gets(str1);
printf("Please input pin the tail:\n");
gets(str2);
char *p = s;
char *p1 = str1;
char *p2 = str2;
char *p3 = NULL;
char *p4 = NULL;
printf("Legal frame in the string:\n");
while(*p)
{
if(strncmp(p,p1,strlen(str1))==0)
{
p3=p;
while(*p3)
{
if(strncmp(p3,p2,strlen(str2))==0)
{
int j=p3-p+strlen(str2),i;
p4 = p;
for(i=0;i<j;i++)
{
printf("%c",*p4++);
}
puts("\0");
}
*p3++;
}
}
*p++;
}
return 0;
}