我从一个程序员那里听说,替换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";
导致错误行为。
是的,由于上述原因,代码不正确。