C 编程,在不将大小作为参数传递的情况下更改函数中的字符串值
C Programming , Changing String Value in function without passing the size as parameter
我有一个问题,我知道以下实现可以正常工作:
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;
}
但是如果我想在不传递指针大小的情况下更改函数中的字符串值,可以吗?如果是,怎么办?如果不是,为什么不呢?
我的意思是我想改变上面的 editMessage 函数,像这样:
void editMessage(char* message){
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) <= sizeOf(message)) {
for (int i=0 ; i < sizeOf(message); i++) {
message[i] = newMessage[i];
}
} else {
printf("size of new message is too big\n");
}
}
主要是这样的调用
editMessage(randMessage);
为什么这不起作用,请详细解释一下,然后我会接受他的回复?
谢谢!
sizeOf(message)
将不起作用。 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");
}
}
对于未被NUL
终止的char
数组,除了发送char
数组的长度作为参数.
因此,在调用函数中,您需要跟踪您在数组中写入的 char
的数量(以了解长度)。
注意我不是说 string 因为只有当 char
的数组变成 string它以 NUL
字符结束。
注意:
使用main()
的标准定义
int main(void) //if no command line arguments.
在 C 中,
void func(char message[])
变为 void func(char *message)
。因此,当您在被调用函数中执行 sizeof(message)
时,它只会 return 指针的大小。在 "C" 中,数组不是按值传递的。
如果您确定,您的字符数组将始终以 null 结尾,您可以使用 strlen
来获取它的长度。
使用strlen
获取输入字符串的长度。
顺便说一句:注意这部分代码:
if (sizeof(newMessage) <= sizeOfMessage) {
for (int i=0 ; i < sizeOfMessage; i++) {
message[i] = newMessage[i];
如果 sizeof(newMessage)
是 9 并且 sizeOfMessage
是 100,您将访问 newMessage[9]
到数组外的 newMessage[99]
。
if i want to change the string value in function without passing the size of pointer, is it possible? if yes , how? if not , why not?
您可以通过strlen()
函数确定输入消息的长度。假设您规定该函数仅适用于以正确的 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;
}
我有一个问题,我知道以下实现可以正常工作:
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;
}
但是如果我想在不传递指针大小的情况下更改函数中的字符串值,可以吗?如果是,怎么办?如果不是,为什么不呢?
我的意思是我想改变上面的 editMessage 函数,像这样:
void editMessage(char* message){
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) <= sizeOf(message)) {
for (int i=0 ; i < sizeOf(message); i++) {
message[i] = newMessage[i];
}
} else {
printf("size of new message is too big\n");
}
}
主要是这样的调用
editMessage(randMessage);
为什么这不起作用,请详细解释一下,然后我会接受他的回复? 谢谢!
sizeOf(message)
将不起作用。 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");
}
}
对于未被NUL
终止的char
数组,除了发送char
数组的长度作为参数.
因此,在调用函数中,您需要跟踪您在数组中写入的 char
的数量(以了解长度)。
注意我不是说 string 因为只有当 char
的数组变成 string它以 NUL
字符结束。
注意:
使用main()
int main(void) //if no command line arguments.
在 C 中,
void func(char message[])
变为 void func(char *message)
。因此,当您在被调用函数中执行 sizeof(message)
时,它只会 return 指针的大小。在 "C" 中,数组不是按值传递的。
如果您确定,您的字符数组将始终以 null 结尾,您可以使用 strlen
来获取它的长度。
使用strlen
获取输入字符串的长度。
顺便说一句:注意这部分代码:
if (sizeof(newMessage) <= sizeOfMessage) {
for (int i=0 ; i < sizeOfMessage; i++) {
message[i] = newMessage[i];
如果 sizeof(newMessage)
是 9 并且 sizeOfMessage
是 100,您将访问 newMessage[9]
到数组外的 newMessage[99]
。
if i want to change the string value in function without passing the size of pointer, is it possible? if yes , how? if not , why not?
您可以通过strlen()
函数确定输入消息的长度。假设您规定该函数仅适用于以正确的 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;
}