一起來學(xué)習(xí)C語言的字符串轉(zhuǎn)換函數(shù)
字符串轉(zhuǎn)整數(shù)
字符串轉(zhuǎn)換為整數(shù)的函數(shù)有兩個,他們的函數(shù)原型如下:
int __cdecl atoi(const char *_Str); long __cdecl atol(const char *_Str);
這兩個函數(shù)的用法都很簡單,atoi函數(shù)將字符串轉(zhuǎn)換為整數(shù)int型,atol函數(shù)將字符串轉(zhuǎn)換為長整形long int型。如果轉(zhuǎn)換無效,返回值都為0,下面通過一個簡單的例子看一下這兩個函數(shù)的用法。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int val;
long val_l;
char str[20];
strcpy(str, "1234");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "abc");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "98993489");
val_l = atol(str);
printf("\n字符串值 = %s, 長整型值 = %ld\n", str, val_l);
strcpy(str, "abc123");
val_l = atol(str);
printf("字符串值 = %s, 長整型值 = %ld\n", str, val_l);
return 0;
}
給字符串賦不同的值,然后使用,atoi函數(shù)和atol函數(shù)對字符串進(jìn)行轉(zhuǎn)換,輸出結(jié)果如下:

通過結(jié)果可以看出,只有當(dāng)字符串有效時才能正確的轉(zhuǎn)換成整數(shù),否則轉(zhuǎn)換的結(jié)果就為0。
將字符串轉(zhuǎn)換為整數(shù)的函數(shù)還有以下兩個:
long __cdecl strtol(const char * __restrict__ _Str,char ** __restrict__ _EndPtr,int _Radix); unsigned long __cdecl strtoul(const char * __restrict__ _Str,char ** __restrict__ _EndPtr,int _Radix);
strtol() 函數(shù)用來將字符串轉(zhuǎn)換為長整型數(shù)(long),它有三個參數(shù):
_Str為要轉(zhuǎn)換的字符串,_EndPtr為第一個不能轉(zhuǎn)換的字符的指針,_Radix為字符串 str 所采用的進(jìn)制。
trtol() 函數(shù)會將參數(shù)str字符串根據(jù)參數(shù)base來轉(zhuǎn)換成長整型數(shù)(long)。參數(shù)base范圍從2至36,或0。參數(shù)base代表str采用的進(jìn)制方式,如base值為10則采用10進(jìn)制,若base值為16則采用16進(jìn)制等。
下面通過一個簡單的例子演示一下strtol() 函數(shù)的用法。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char str[30] = "123 -456 abc";
char *pEnd;
long ret1,ret2;
ret1 = strtol(str, &pEnd, 10);
ret2 = strtol(pEnd, &pEnd, 10);
printf("數(shù)字1是: %ld\n", ret1);
printf("數(shù)字2是: %ld\n", ret2);
printf("字符串部分是: %s \n", pEnd);
return 0;
}
定義一個字符串,然后使用strtol() 函數(shù)轉(zhuǎn)換字符串中的數(shù)字,輸出結(jié)果如下:

通過打印的結(jié)果可以看出,strtol() 函數(shù)將字符串中的兩個數(shù)字都成功換成為整數(shù)了。
當(dāng)strtol() 函數(shù)讀取字符串時,讀取到第一個空格是,由于空白字符不能轉(zhuǎn)換,所以函數(shù)返回,并將空白字符的存儲在 pEnd中,接下來從空白位置繼續(xù)轉(zhuǎn)換,將字符串“-456”轉(zhuǎn)換為數(shù)字之后,又遇到了空白字符,不能繼續(xù)轉(zhuǎn)換,函數(shù)退出,將第二個空白字符存儲在 pEnd中,最后將剩余的字符串換打印出來。
通過strtol() 函數(shù)就可以智能的將字符串的數(shù)字提取出來。
strtoul 函數(shù)用來將字符串轉(zhuǎn)換成無符號長整型數(shù)(unsigned long),它的用法和strtol() 函數(shù)基本一樣。
修改上面的代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char str[30] = "123 456 abc";
char *pEnd;
long ret1,ret2;
ret1 = strtoul(str, &pEnd, 10);
ret2 = strtoul(pEnd, &pEnd, 10);
printf("數(shù)字1是: %lu\n", ret1);
printf("數(shù)字2是: %lu\n", ret2);
printf("字符串部分是: %s \n", pEnd);
return 0;
}
輸出結(jié)果為:

如果在字符串的數(shù)字前面添加上負(fù)號,轉(zhuǎn)換的結(jié)果就會出錯。

在使用strtol() 函數(shù)和strtoul 函數(shù)時要注意兩點(diǎn):
- 當(dāng)
base的值為0時,默認(rèn)采用10進(jìn)制轉(zhuǎn)換,但如果遇到'0x' / '0X'前置字符則會使用16進(jìn)制轉(zhuǎn)換,遇到'0'前置字符則會使用8進(jìn)制轉(zhuǎn)換。 - 若
endptr不為NULL,則會將遇到的不符合條件而終止的字符指針由endptr傳回;若endptr為NULL,則表示該參數(shù)無效,或不使用該參數(shù)。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Mingw64編譯wxWidgets 3.0.2常見錯誤分析
這篇文章主要介紹了Mingw64編譯wxWidgets 3.0.2常見錯誤分析,需要的朋友可以參考下2016-11-11
在clion上配置libtorch開發(fā)環(huán)境的圖文詳解
這篇文章主要介紹了在clion上配置libtorch開發(fā)環(huán)境的圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C或C++報(bào)錯:ld returned 1 exit status報(bào)錯的原因及解
這篇文章主要介紹了C或C++報(bào)錯:ld returned 1 exit status報(bào)錯的原因及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
Qt GUI圖形圖像開發(fā)之Qt表格控件QTableView簡單使用方法及QTableView與QTableWidget區(qū)
這篇文章主要介紹了Qt GUI圖形圖像開發(fā)之Qt表格控件QTableView簡單使用方法,需要的朋友可以參考下2020-03-03

