我从一个程序员那里听说,替换c字符串文字会导致未定义的行为。
例如。:

char *a = "111";
a[0] = '2'; //Undefinded behaviour

但是,我在下面的练习中找不到类似的方法,我必须将12小时时间转换为军事时间:
char* timeConversion(char* s) {
    char* military_time = malloc(9*sizeof(char));
    strncpy(military_time, s,8);
    if(s[8] == 'P'){
       if(s[0]!='1' || s[1]!='2'){
       char hours = 10*(s[0]-'0')+(s[1]-'0');
       hours += 12;
       char tenner = (hours/10) + '0';
       char onner = hours%10 + '0';
       military_time[0] = tenner; //undefined
       military_time[1] = onner;
       }
    } else {
        if(s[0]=='1' && s[1] =='2'){
            military_time[0] = '0';
            military_time[1]= '0';
        }
    }
    return military_time;
}

有办法绕过这个问题吗?
此外,我想知道这个代码的行为。
替换:
char* military_time = malloc(9*sizeof(char));

使用:
char* military_time = "12345678";

导致错误行为。我认为在第二种情况下,变量不会过时。这可能是我提交答案的网站的问题吗?
谢谢您。

最佳答案

我从一个程序员那里听说,替换c字符串文字会导致未定义的行为。
正确,不能尝试修改字符串文本。编译器通常将它们放在只读区域中。
指向字符串文本的指针应使用const声明,以避免未定义的行为:

char const *a = "111";
a[0] = '2';            // Ok: compiler error, because assigment to const

但是,在下面的练习中,我找不到类似的方法。。。
char* military_time = malloc(9*sizeof(char));不创建字符串文本,因此military_time[0] = tenner;可以。
您可以修改已为其分配内存的内存:
char b[] = "111";      // Create array and initialize with contents copied from literal
b[0] = '2';            // Ok: array can be modified

char *c = malloc(4);   // Create pointer which points to malloc'd area
strcpy(c, "111");      // Copy content from literal
c[0] = '2';            // Ok: pointer points to area that can be modified

char* military_time = "12345678";

导致错误行为。
是的,由于上述原因,代码不正确。

10-07 22:35