【问题标题】:C Programming , Changing String Value in function without passing the size as parameterC 编程,在函数中更改字符串值而不将大小作为参数传递
【发布时间】:2016-08-26 14:15:29
【问题描述】:

我有一个问题,我知道以下实现可以正常工作:

  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)指针的大小,而不是它指向的对象的大小。
  • 使用strlen获取字符串的长度
  • @user3001566 至少你展示的第一个函数是不正确的,没有意义。:)

标签: c string function char sizeof


【解决方案1】:

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 数组的长度作为参数发送之外,没有其他方法可以找出长度。

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

请注意,我不是在说 string,因为 char 的数组只有在被 NUL 字符终止时才会变成 string。 em>


注意:

使用main()的标准定义

int main(void) //if no command line arguments.

【讨论】:

  • 如果字符数组不会被null终止怎么办?那么如果我不能使用 strlen 解决方案是什么?如果您可以解释这种情况并将其添加到您的答案中,那么我会接受您的帖子作为该线程的答案,谢谢
  • @user3001566,你去吧.. :)
  • 注意你的代码int size = strlen(message);我在Xcode中试过你的代码,我得到了编译和警告错误,这里有2个警告,你能纠正你的代码吗? /Users/XXX/test/test/main.c:59:17:隐式转换失去整数精度:'unsigned long' 到 'int' 第二个错误是 /Users/XXX/test/test/main.c:59 :17: 隐式声明库函数 'strlen' 类型为 'unsigned long (const char *)' 我暂时取消选中你的答案为不接受,直到你修复它,谢谢!
【解决方案2】:

如果我想在不传递指针大小的情况下更改函数中的字符串值,可以吗?如果是,如何?如果不是,为什么不呢?

您可以通过strlen() 函数确定输入消息的长度。假设您规定该函数仅适用于正确以空结尾的字符串,那么假设包含该字符串的数组足够长以容纳它(包括终止符)是合理的。因此,在某种程度上,您可以用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;
}

【讨论】:

    【解决方案3】:

    在 C 语言中,

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

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

    【讨论】:

    • 如果字符数组不会被null终止怎么办?那么如果我不能使用 strlen 解决方案是什么?谢谢
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多