c語言字符串輸入函數gets的編寫 C語言字符串輸入函數



文章插圖
c語言字符串輸入函數gets的編寫 C語言字符串輸入函數

文章插圖
面試中常見的C語言字符串操作,快來看看,是否對你有幫助!
字符串倒序輸出
實現邏輯,通過strlen獲取字符串長度,然后通過 len/2 進行交叉賦值,這里需要注意,不需要考慮len是奇數還是偶數的問題 。
如果len是奇數,最后一個字符就不需要倒序,如果是偶數,最后兩個字符就倒序 。
#include “stdio.h”
void rechange_str(char *str)
{
int i, len;
char tmp;
if (NULL == str) {
return ;
}
len = strlen(str);
for (i = 0; i < len/2; i ++) {
tmp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = tmp;
}
}
int main(void)
{
char str[20] = “hello,world”;
printf(“%sn”,str);
rechange_str(str);
printf(“%sn”,str);
return (0);
}
程序輸出
hello,world
dlrow,olleh
——————————–
Process exited after 0.02841 seconds with return value 0
請按任意鍵繼續. . .
整型轉字符串
實現邏輯,每個整數看其轉換進制,從個位到十位百位都可以通過%操作加上/操作獲得,再用一個字符數組保存0-F 。
用個位數對應值轉為字符,注意轉換出的字符串是反向的,還要考慮傳入的若是負數如何處理,再用翻轉字符串完成最后整個操作 。
下面這段代碼需要好好研究一下,最好自己運行試試 。
#include “stdio.h”
char *sky_itoa(int value, char *str, unsigned int radix)
{
char list[] = “0123456789ABCDEF”;
unsigned int tmp_value;
int i, j, k;
if (NULL == str) {
return NULL;
}
if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {
return NULL;
}
i = 0;
k = 0;
if (radix == 10 && value < 0) {
tmp_value = http://www.mnbkw.com/jxjc/188707/(unsigned int)(0 – value);
str[i++] = ‘-‘;
k = 1;
} else {
tmp_value = http://www.mnbkw.com/jxjc/188707/(unsigned int)value;
}
do {
str[i++] = list[tmp_value%radix];
tmp_value /= radix;
} while(tmp_value);
str[i] = ‘’;
//翻轉
char tmp;
for (j = k; j < (i+k)/2; j++) {
tmp = str[j];
str[j] = str[i+k-j-1];
str[i+k-j-1] = tmp;
}
return str;
}
int main(void)
{
int a = 1254545;
char str[100] ={0};
printf(“%sn”,sky_itoa(a,str,2));
printf(“%sn”,sky_itoa(a,str,8));
printf(“%sn”,sky_itoa(a,str,10));
printf(“%sn”,sky_itoa(a,str,16));
return (0);
}
程序輸出
100110010010010010001
4622221
1254545
132491
——————————–
Process exited after 0.02963 seconds with return value 0
請按任意鍵繼續. . .
字符串復制
實現邏輯,逐個賦值直到遇到’’停止即可 。
#include “stdio.h”
char *sky_strcpy(char *dst, const char *str)
{
if (NULL == dst || NULL == str) {
return NULL;
}
char *ret = dst;
while (*str != ‘’) {
*dst ++ = *str ++;
}
return ret;
}
int main(void)
{
char str_1[100] = “hello,world”;
char str[100] ={0};
sky_strcpy(str,str_1);
printf(“str_1:%sn”,str_1);
printf(“str:%sn”,str);
return (0);
}
程序輸出
str_1:hello,world
str:hello,world
——————————–
Process exited after 0.03334 seconds with return value 0
請按任意鍵繼續. . .
字符串比較
1、正常比較是否相同 實現邏輯,判斷字符串長度是否相同,若相同逐個比較字符是否相同
#include “stdio.h”
int sky_strcmp(char *dst, char *str)
{
int i, len;
if (NULL == dst || NULL == str) {
return 0;
}
if (strlen(dst) != strlen(str)) {
return 0;
}
len = strlen(dst);
for (i = 0; i < len; i++) {
if (*dst++ != *str++) {
return 0;
}
}
return 1;
}
int main(void)
{
char str_1[100] = “hello,world”;
char str_2[100] = “hello,world”;
char str[100] = “adfs”;
printf(“%dn”,sky_strcmp(str_1,str));
printf(“%dn”,sky_strcmp(str_1,str_2));
return (0);
}
程序輸出
0
1
【c語言字符串輸入函數gets的編寫 C語言字符串輸入函數】——————————–
Process exited after 0.02802 seconds with return value 0
請按任意鍵繼續. . .
2、忽略大小寫字符串比較
實現邏輯,在比較字符時可以將其統一轉換為大寫或小寫,然后再進行比對即可,和正常對比無其他不同
#include “stdio.h”
#define CONVERT(c) (((c) >= ‘A’ && (c) <= ‘Z’) ? ((c) – ‘A’ + ‘a’) : (c))
int sky_strcmp(char *dst, char *str)
{
int i, len;
if (NULL == dst || NULL == str) {
return 0;
}
if (strlen(dst) != strlen(str)) {
return 0;
}
len = strlen(dst);
for (i = 0; i < len; i++) {
if (CONVERT(*dst) != CONVERT(*str)) {
return 0;
}
dst ++;
str ++;
}
return 1;
}
int main(void)
{
char str_1[100] = “heLlo,world”;
char str_2[100] = “hello,world”;
char str[100] = “adfs”;
printf(“%dn”,sky_strcmp(str_1,str));
printf(“%dn”,sky_strcmp(str_1,str_2));
return (0);
}
程序輸出
0
1
——————————–
Process exited after 0.04624 seconds with return value 0
請按任意鍵繼續. . .
memcpy函數實現
實現邏輯,主要就是逐個賦值即可完成
1、不考慮拷貝覆蓋問題
#include “stdio.h”
#include “string.h”
void *sky_memecpy(void *dst, const void *str, int n)
{
if (NULL == dst || NULL == str || n <= 0) {
return NULL;
}
char *pdst = (char *)dst;
char *pstr = (char *)str;
while (n –) {
*pdst ++ = *pstr ++;
}
return dst;
}
int main(void)
{
char str_1[100] = “heLlo,world”;
char str_2[100] = “sdfsdfs”;
sky_memecpy(str_2,str_1,strlen(str_1));
printf(“%sn”,str_2);
return (0);
}
程序輸出
heLlo,world
——————————–
Process exited after 0.02516 seconds with return value 0
請按任意鍵繼續. . .
2、考慮拷貝覆蓋問題
拷貝覆蓋是我們在拷貝字符串的時候需要注意的一個問題,我下面的示例程序,使用第一個函數的時候,就出現了問題,使用第二個函數就沒有出現問題 。
原因是,我們源字符串和目的字符串的地址都是一樣的,我們希望把字符串往后移動一個位置,但是實際上出現了問題 。
#include “stdio.h”
#include “string.h”
void *sky_memecpy_1(void *dst, const void *str, int n)
{
if (NULL == dst || NULL == str || n <= 0) {
return NULL;
}
char *pdst = (char *)dst;
char *pstr = (char *)str;
while (n –) {
*pdst ++ = *pstr ++;
}
return dst;
}
void *sky_memecpy(void *dst, const void *str, int n)
{
if (NULL == dst || NULL == str || n <= 0) {
return NULL;
}
char *pdst = (char *)dst;
char *pstr = (char *)str;
if (pdst > pstr && pdst < pstr + n) {
pdst = pdst + n – 1;
pstr = pstr + n – 1;
while (n –) {
*pdst — = *pstr –;
}
} else {
while (n –) {
*pdst ++ = *pstr ++;
}
}
return dst;
}
int main(void)
{
char str_1[100] = “heLlo,world”;
char str_2[100] = “heLlo,world”;
sky_memecpy_1(str_1+1,str_1,strlen(str_1));
printf(“%sn”,str_1);
sky_memecpy(str_2+1,str_2,strlen(str_2));
printf(“%sn”,str_2);
return (0);
}
程序輸出
hhhhhhhhhhhh
hheLlo,world
——————————–
Process exited after 0.02773 seconds with return value 0
請按任意鍵繼續. . .
針對上面的拷貝覆蓋問題,單獨寫了一個測試程序
#include “stdio.h”
#include “string.h”
void *sky_memecpy(void *dst, const void *str, int n)
{
if (NULL == dst || NULL == str || n <= 0) {
return NULL;
}
char *pdst = (char *)dst;
char *pstr = (char *)str;
while (n –) {
printf(“dst:%c—>str:%cn”,*pdst,*pstr);
*pdst ++ = *pstr ++;
}
return dst;
}
int main(void)
{
char str_1[100] = “heLlo,world”;
sky_memecpy(str_1+1,str_1,strlen(str_1));
printf(“%sn”,str_1);
return (0);
}
程序輸出
dst:e—>str:h
dst:L—>str:h
dst:l—>str:h
dst:o—>str:h
dst:,—>str:h
dst:w—>str:h
dst:o—>str:h
dst:r—>str:h
dst:l—>str:h
dst:d—>str:h
dst: —>str:h
hhhhhhhhhhhh
——————————–
Process exited after 0.02575 seconds with return value 0
請按任意鍵繼續. . .
初始的時候,dst指向 e 字符,str 指向h 字符,然后每次都是dst先移動,str再移動,就出現了dst被h字符所覆蓋 。