Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程,更改函数中的字符串值,而不将大小作为参数传递_C_String_Function_Char_Sizeof - Fatal编程技术网

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