修改字符串中某個(gè)字符為'0'
在閱讀某項(xiàng)目時(shí)發(fā)現(xiàn)此問題, 然后寫了相關(guān)代碼之后,發(fā)現(xiàn)還是有問題,但我又并不理解。
// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)
//code 1
#include<stdio.h>
#include<stdlib.h>
char *
duo_split_at(char *s, char delimiter, unsigned int position)
{
unsigned int count = 0;
char *iter = NULL;
char *result = s;
for (iter = s; *iter; iter++) {
if (*iter == delimiter) {
if (count < position) {
result = iter + 1;
count++;
}
*iter = '\0';
}
if(*iter !='\0'){
printf("%c\n",*iter);
}
}
if (count < position) {
return NULL;
}
return result;
}
int main(){
const char delimiter = '/';
const unsigned int delimited_position = 5;
char *user;
// char *pw_geco ;
char *pw_geco = "code1/code2/code3//textField/usergecosparsed";
user = duo_split_at(pw_geco, delimiter, delimited_position);
printf("%s\n%s\n",user,pw_geco);
return 0;
}
請(qǐng)輸入代碼
//code 2
#include<stdio.h>
#include<stdlib.h>
char *
duo_split_at(char *s, char delimiter, unsigned int position)
{
unsigned int count = 0;
char *iter = NULL;
char *result = s;
for (iter = s; *iter; iter++) {
if (*iter == delimiter) {
if (count < position) {
result = iter + 1;
count++;
}
*iter = '\0';
}
if(*iter !='\0'){
printf("%c\n",*iter);
}
}
if (count < position) {
return NULL;
}
return result;
}
int main(){
const char delimiter = '/';
const unsigned int delimited_position = 5;
char *user;
// char *pw_geco ;
char pw_geco[] = "code1/code2/code3//textField/usergecosparsed";
user = duo_split_at(pw_geco, delimiter, delimited_position);
printf("%s\n%s\n",user,pw_geco);
return 0;
}
//code 3
#include<stdio.h>
#include<stdlib.h>
char *
duo_split_at(char *s, char delimiter, unsigned int position)
{
unsigned int count = 0;
char *iter = NULL;
char *result = s;
for (iter = s; *iter; iter++)
{
if (*iter == delimiter)
{
if (count < position)
{
result = iter + 1;
count++;
}
*iter = '\0';
}
if(*iter !='\0')
{
printf("%c\n",*iter);
}
}
if (count < position)
{
return NULL;
}
return result;
}
int
main ()
{
char* user = "daijwei";
struct passwd *pw;
if((pw = getpwnam(user)) == NULL)
{
printf("error");
return -1;
}
const char delimiter = '/';
const unsigned int delimited_position = 5;
user = duo_split_at (pw->pw_gecos, delimiter, delimited_position);
printf ("%s\n%s\n", user, pw->pw_gecos);
return 0;
}
假定用戶gecos格式為"code1/code2/code3//textField/usergecosparsed"
這三段代碼的效果都是為了實(shí)現(xiàn)同一個(gè)功能, 去除linux 用戶gecos 中的usergecosparsed , code1 中會(huì)報(bào)錯(cuò),無法執(zhí)行, 查詢過后說是因?yàn)閏har pw_geco 不能被修改, 因?yàn)槭怯胏har 定義的字符串。
修改為code2之后可以順利執(zhí)行。
但是為什么code3也可以順利執(zhí)行呢? struct passwd 中定義的 pw_geocs 也是用char* 定義的啊,所以我十分懵逼, 求解為什么會(huì)這樣。
開始我也感覺是能修改成功的,但是試了一下你的代碼后,也發(fā)現(xiàn)了你說的問題。然后看了 getpwnam()的源碼后,我想可以這樣解釋。
首先說一下你的第一次的代碼為什么不能成功:
char *pw_geco = "code1/code2/code3//textField/usergecosparsed";
你這樣定義的是使 pw_gecon 這個(gè)指針變量指向了 "code1/code2/code3//textField/usergecosparsed" 這個(gè)字符串常量,所以接下來你的代碼想要改變這個(gè)常量的值,所以系統(tǒng)不會(huì)讓你修改。所以如果你把代碼改成這樣:
char *pw_geco=NULL;
char pw_geco=(char)malloc(200); //為這個(gè) pw_geco指針變量申請(qǐng)內(nèi)存,存放字符串.
sprintf(pw_geco,"%s","code1/code2/code3//textField/usergecosparsed");
這樣你再去改變通過 pw_geco 這個(gè)指針變量改變的就不是常量字符串。而是 pw_geco 指向的一個(gè)可變的字符串。
問題不在于“用char定義的字符串不能修改”,而在于將字符串常量賦值給了char*。
ISO C++禁止字符串字面常量轉(zhuǎn)型為char*。對(duì)于字面常量"code1/code2/code3//textField/usergecosparsed",你可以寫
const char* str = "code1/code2/code3//textField/usergecosparsed";
不能將const去掉。
從類型上說,const T不能轉(zhuǎn)為T;從實(shí)現(xiàn)上講,字面常量放置在程序的常量段,修改可能會(huì)觸發(fā)保護(hù)機(jī)制。
修改char*變量指向的內(nèi)存本身沒有任何問題,所以code3可以順利執(zhí)行。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。