2017-11-10 39 views
2

我想传递一个字符串到C中的函数来编辑该字符串。 我已经知道我应该传递一个指向我想改变的字符串的指针。但是,我得到奇怪的结果。这是我的代码,用参数http://www.test.test/testC改变字符串传递给函数不工作

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 

这里有什么问题?

+0

你结束你的字符串与背隙0(我在手机上打字,所以我不能写反斜杠)。 –

+0

@ Cppplus1该字符串是从'argv [1]'中复制的,'memcpy'调用拷贝'strlen(argv [1])+ 1'字节,所以它应该以NUL结尾。 – jamesdlin

+0

你错误地假设指针和数组是相同的东西。它们不是 - 在函数中设置'* newaddress'因此具有未定义的行为。你也不允许'strtok()'返回一个'NULL'的可能性。 – Peter

回答

2

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

相反,如果你做了它应该工作:

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

char数组以外的地址是什么?换句话说,通过“地址本身”是什么意思?我需要更改哪些内容才能正确传递它? – emilaz

+0

@emilaz看我的编辑。 – jamesdlin

+0

它的工作,谢谢。你介意回答你“地址本身”是什么意思的问题吗? – emilaz

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]); ((& address),argv [1]); - 这是行不通的。

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

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