我想要的输出如下:
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状态打印所示。它应该递归地工作。
我可以知道我的代码有什么问题吗?
答案 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;
}
答案 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()来检查新单词的大小与已知的最大缓冲区大小,假设你想要一个更一般的情况而不仅仅是“苹果”和更改功能中的“橙色”..
一旦妥善解决了这些问题,您应该会看到更好的结果。