C编程,在函数中更改字符串值而不将大小作为参数

时间:2016-08-26 14:15:30

标签: 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(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);

为什么这不起作用,请详细解释一下,然后我会接受他的回答? 谢谢!

4 个答案:

答案 0 :(得分:3)

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");
    }

}

对于未由char终止的NUL数组,除了发送char数组的长度作为参数之外,无法找出长度。

因此,在调用函数中,您需要跟踪您在数组中写入的char的数量(以了解长度)。

请注意,我不是说字符串,因为char数组只有在NUL终止时才会成为字符串字符。

注意:

使用main()

的标准定义
int main(void) //if no command line arguments.

答案 1 :(得分:2)

  

如果我想在不传递指针大小的情况下更改函数中的字符串值,是否可能?如果有,怎么样?如果没有,为什么不呢?

您可以通过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;
}

答案 2 :(得分:1)

在C中,

void func(char message[])变为void func(char *message)。因此,当您在被调用函数中执行sizeof(message)时,它将仅返回指针的大小。在“C”中,数组不通过值传递。

如果您确定,您的字符数组将始终以null结尾,您可以使用strlen来获取它的长度。

答案 3 :(得分:0)

使用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]