C编程,更改函数中的字符串值,而不将大小作为参数传递
我有一个问题,我知道以下实现工作正常:C编程,更改函数中的字符串值,而不将大小作为参数传递,c,string,function,char,sizeof,C,String,Function,Char,Sizeof,我有一个问题,我知道以下实现工作正常: void editMessage(char* message , int sizeOfMessage){ char newMessage[] = "modified"; printf("size of message is %lu \n",sizeof(message)); printf("size of new message is %lu \n",sizeof(newMessage)); if (sizeof(n
void editMessage(char* message , int sizeOfMessage){
char newMessage[] = "modified";
printf("size of message is %lu \n",sizeof(message));
printf("size of new message is %lu \n",sizeof(newMessage));
if (sizeof(newMessage) <= sizeOfMessage) {
for (int i=0 ; i < sizeof(newMessage); i++) {
message[i] = newMessage[i];
}
} else {
printf("size of new message is too big\n");
}
}
int main() {
char randMessage[] = "original message";
editMessage(randMessage,sizeof(randMessage));
printf("the value of randMessage after function call is %s \n",randMessage);
return 0;
}
为什么这不起作用,请你详细解释一下,然后我会接受他的回答?
谢谢 sizeOf(消息)
将不起作用sizeOf(message)
将给出变量message
的大小,由于最初message
是指针,因此您将得到指针的大小
由于它是一个以
NUL
结尾的字符串,因此可以使用strlen()
获取字符串的长度,并在函数中使用该长度
你的代码应该是这样的
void editMessage(char* message){
char newMessage[] = "modified";
int size = strlen(message);
printf("size of message is %d \n", size);
printf("size of new message is %lu \n",sizeof(newMessage));
if (sizeof(newMessage) <= size) {
for (int i=0 ; i < size; i++) {
message[i] = newMessage[i];
}
} else {
printf("size of new message is too big\n");
}
}
在C中
void func(char message[])
变为void func(char*message)
。因此,在调用的函数中执行sizeof(message)
时,它只返回指针的大小。在“C”中,数组不通过值传递
如果您确定,您的字符数组将始终以null结尾,则可以使用
strlen
获取其长度。使用strlen
获取输入字符串的长度
顺便说一句:请注意代码的这一部分:
if (sizeof(newMessage) <= sizeOfMessage) {
for (int i=0 ; i < sizeOfMessage; i++) {
message[i] = newMessage[i];
if(sizeof(newMessage)
如果我想在不传递指针大小的情况下更改函数中的字符串值,有可能吗?如果有,怎么做?如果没有,为什么不
您可以通过strlen()确定输入消息的长度
function。假设您规定该函数仅适用于正确以null结尾的字符串,那么它可以合理地假设包含该字符串的数组足够长以容纳它,包括终止符。因此,在某种程度上,您可以strlen(message)+1
代替原始的sizeOfMessage
但是,这比原始函数更具限制性,因为包含字符串的数组可能比字符串所需的大。如果使用输入字符串的长度限制替换字符串的长度,则永远不能使用任何此类多余容量。请考虑:
int main() {
char randMessage[1024] = "";
/*
* sizeof(randMessage) is 1024, but strlen(randMessage) is 0. Which do
* you prefer as the limit on the size of the message that editMessage()
* can insert?
*/
editMessage(randMessage, sizeof(randMessage));
return 0;
}
sizeof(message)
是指针的大小,而不是指针指向的对象的大小。使用strlen
获取字符串的长度。@user3001566至少您显示的第一个函数不正确且没有意义。:)如果charachter数组不会以null结尾怎么办?那么,如果我不能使用斯特伦,解决办法是什么?谢谢如果charachter数组不会以null结尾,该怎么办?那么,如果我不能使用斯特伦,解决办法是什么?如果你能解释这个条件并把它添加到你的答案中,那么我会接受你的帖子作为这个帖子的答案,Thanks@user3001566,给你……)考虑您的代码int size=strlen(消息)代码>我在Xcode中尝试了你的代码,我得到了编译和警告错误,这里有两个警告,你能纠正你的代码吗/Users/XXX/test/test/main.c:59:17:隐式转换丢失整数精度:“unsigned long”到“int”还有第二个错误是/Users/XXX/test/test/main.c:59:17:隐式声明库函数“strlen”的类型为“unsigned long(const char*)”,我暂时取消选中您的答案为不接受,直到您修复它,谢谢!
int main(void) //if no command line arguments.
if (sizeof(newMessage) <= sizeOfMessage) {
for (int i=0 ; i < sizeOfMessage; i++) {
message[i] = newMessage[i];
int main() {
char randMessage[1024] = "";
/*
* sizeof(randMessage) is 1024, but strlen(randMessage) is 0. Which do
* you prefer as the limit on the size of the message that editMessage()
* can insert?
*/
editMessage(randMessage, sizeof(randMessage));
return 0;
}