C更改传递给函数的字符串不起作用

时间:2017-11-10 21:34:16

标签: c string pointers

我正在尝试将字符串传递给C中的函数来编辑该字符串。 我已经知道我应该将指针传递给我想要更改的字符串。但是,我得到了奇怪的结果。这是我的代码,使用参数http://www.test.test/test

执行
int getAddress(char **newAddress, char *oldAddress);

int main(int argc, char *argv[]) {
//retrieving the Address Name from Input
char address[512];
memcpy(address, argv[1], strlen(argv[1])+1);
printf("%s\n", address);
getAddress((&address), argv[1]);
printf("%s\n", address);
}

int getAddress(char **newAddress, char *oldAddress){
  char *checkAddress;
  checkAddress = strstr (oldAddress, "http://");
   *newAddress = strstr (oldAddress,"www.");
   if(!(newAddress && checkAddress)){
     printf("Please enter a string of the form http://www.example.example\n");
     exit(0);
   }
  *newAddress=strtok(*newAddress, "/");
   printf("%s\n", *newAddress);
  return 1;
  }

我得到的输出如下:

http://www.test.de/test
www.test.de
Jg��://www.test.de/test

这里有什么问题?

2 个答案:

答案 0 :(得分:2)

您将address声明为char 数组。然后,您尝试将address 变量变为char**来变异。这是未定义的行为。 (编译器应该警告过你。)也就是说,你不能让数组“指向”其他东西。您可以修改指针以指向其他内容,但arrays aren't pointers

如果相反,你应该这样做:

int main(int argc, char *argv[]) {
    char array[512];
    char* address = array;
    ...
    getAddress(&address, argv[1]);
    printf("%s\n", address);
}

答案 1 :(得分:1)

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int getAddress(char **newAddress, char *oldAddress);

int main(int argc, char *argv[]) 
{
//retrieving the Address Name from Input
    char address[512];
    char *copy = memcpy(address, argv[1], strlen(argv[1])+1);
    printf("%s\n", copy);
    getAddress(&copy, argv[1]);
    printf("*copy:%s\n", copy);
}

int getAddress(char **newAddress, char *oldAddress)
{
    char *checkAddress;
    checkAddress = strstr (oldAddress, "http://");
    *newAddress = strstr (oldAddress,"www.");

    if(!(newAddress && checkAddress))
    {
        printf("Please enter a string of the form http://www.example.example\n");
        exit(0);
    }

    *newAddress = strtok(*newAddress, "/");
    printf("*newAddress:%s\n", *newAddress);
    return 1;
 }

试试这段代码。这是你想要达到的目标吗?编译代码时是否使用了-Wall标志?它已显示警告:从不兼容的指针类型[-Wincompatible-pointer-types]传递'getAddress'的参数1   getAddress(& address,argv [1]);因为你做了getAddress((& address),argv [1])而发生了 - 这不行。

char *copy = memcpy(address, argv[1], strlen(argv[1])+1);
    printf("%s\n", copy);
    getAddress(&copy, argv[1]); 

相反,我们必须使用指向字符串的指针并将其作为参数传递给getAddress函数。我希望这可以帮助你))