在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C/ 關(guān)于字符串修改的問題

關(guān)于字符串修改的問題

題目描述

修改字符串中某個(gè)字符為'0'

題目來源及自己的思路

在閱讀某項(xiàng)目時(shí)發(fā)現(xiàn)此問題, 然后寫了相關(guān)代碼之后,發(fā)現(xiàn)還是有問題,但我又并不理解。

相關(guā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;
}

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

假定用戶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è)可變的字符串。

2018年6月1日 15:15
編輯回答
赱丅呿

問題不在于“用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í)行。

2017年7月23日 17:43