在C

时间:2016-01-05 18:36:46

标签: c string recursion pass-by-reference

我想要的输出如下:

orange 1
apple 2
apple 3

相反,我明白了:

orange 1
apple 2
orange 3

当我执行我的代码时:

#include <stdio.h>
#include <stdlib.h>

void change(char *word) {        // passing pointer to subroutine
    if (word != "apple") {       // WARNING FROM COMPILER
        printf("%s 1\n", word);  // value state #1
        word = "apple";          // change "orange" to "apple"
        change(word);            // recursion happens here
    } else
        printf("%s 2\n", word);  // value state #2
}

int main() {
    char word[] = "orange";

    change(word);                // pass string by reference
    printf("%s 3\n", word);      // value state #3 

    return 0;
}

顺便说一下,我使用gcc编译器并发出1个警告:

与字符串文字的比较导致未指定的行为[-Waddress] 在第5行:

if (word != "apple") {         // WARNING FROM COMPILER

我已经尝试了很多方法,但仍未能从main()change()进行正确的传递,如#3状态打印所示。它应该递归地工作。

我可以知道我的代码有什么问题吗?

4 个答案:

答案 0 :(得分:5)

你不能使用相等或不等运算符来比较字符串,它会比较指针 word和数组"apple"衰变的那个。

此外,您无法在代码中使用赋值运算符,因为它将仅分配给函数内的本地指针变量word

要解决第一个问题,请改用strcmp,第二次使用strcpy。但是在使用strcpy时要小心,这样就不会复制到写入原始数组末尾的长字符串。

答案 1 :(得分:0)

尝试以下更改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change(char *word){         //passing pointer to subroutine
    if(!strcmp(word,"apple")){         //returns 0 when strings are equal
        printf("%s 1\n", word);  //value state #1
        strcpy(word,"apple");          //change "orange" to "apple"
        change(word);            //recursion happens here
    }
    else printf("%s 2\n", word); //value state #2
}

int main(){
    char word[] = "orange";

    change(word);                //pass string by reference
    printf("%s 3\n", word);      //value state #3 

    return 0;
}

strcmp() description here

答案 2 :(得分:0)

首先:请尊重警告。不要比较字符串文字。

但是,为了说明为什么你没有得到预期的结果,原因是虽然你传递了一个指针,但你是按值传递它的。因此,即使您认为要为变量字指定新地址,也不会反映在调用函数中。

解决方案

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change(char *word) {         
    if (strcmp(word, "apple")) {        
        printf("%s 1\n", word);  
        strcpy(word, "apple");          
        change(word);            
    } else
        printf("%s 2\n", word);  // value state #2
}

int main() {
    char word[20]; 

    strcpy(word, "orange");
    change(word);                // pass string by reference
    printf("%s 3\n", word);      // value state #3 

    return 0;
}

答案 3 :(得分:0)

!=引用不起作用。您需要使用strcmp()进行比较。同样,更改缓冲区的内容需要strcpy()。此外,缓冲区的大小不正确,因为“apple”会创建一个包含6个字符的缓冲区(包括结尾的'\ 0'NULL字符)。 “orange”需要一个大小为7的缓冲区,因此如果初始字小于橙色,你也会遇到缓冲区溢出问题(尽管你的示例代码确实将其设置为橙色)。你应该让你的缓冲区足够大,以适应你的单词所需的最大大小,并调用strlen()来检查新单词的大小与已知的最大缓冲区大小,假设你想要一个更一般的情况而不仅仅是“苹果”和更改功能中的“橙色”..

一旦妥善解决了这些问题,您应该会看到更好的结果。