Sou*_*jee 4 c string printf pointers arguments
我发现了一些有趣的东西,但无法解释它.我正在编写一个简单的例程来反转字符串.这很好,没有抱怨.
我的问题在于printf.当我单独打印原始字符串时,它打印正确,但是当我打印原始字符串作为第一个arg,而函数调用reverse作为第二个时,两者都显示为反转.
输出:
|| abcdthelgko ||
Orig Str:| okglehtdcba |,Rev Str | okglehtdcba |
码:
char* ReverseStr(char* str, int len)
{
char *start = &str[0], *end = &str[len-1];
char temp;
while(start < end)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
return str;
}
int main()
{
char str_unique[] = "abcdthelgko";
int str_unique_len = sizeof(str_unique)/sizeof(str_unique[0]);
printf("\n || %s || \n", str_unique);
printf("Orig Str: | %s |, Rev Str | %s |\n", str_unique, ReverseStr(str_unique, str_unique_len-1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
*反馈后修改:* 测试2个理论1.Printf从右到左处理注释2.如果函数调用是args之一,那个函数在printf之前被调用,我做了另一个示例代码来改变值通过引用传递的变量.我看到的是,在变量值中,它可以正常工作:================== OUTPUT ================== ====
i = 5, changed i = 2, again i= 2
changed i = 2, i= 2
i = 5, changed i = 2
Run Code Online (Sandbox Code Playgroud)
==================代码======================
int* change (int* addr);
int main()
{
int i;
i=5;
printf("\n i = %d, changed i = %d, again i= %d \n ", i, *change(&i), i);
i=5;
printf("\n changed i = %d, i= %d \n", *change(&i), i);
i=5;
printf("\n i = %d, changed i = %d \n", i, *change(&i));
return 0;
}
int* change (int* addr)
{
*addr = 2;
return (addr);
}
Run Code Online (Sandbox Code Playgroud)
由于ReverseStr它是就地操作(称为改变输入),因此"原始"字符串不再可用.
当您使用另一个函数调用作为其参数之一调用函数时,首先执行内部调用.考虑:
printf("%lf", pow(2, 2));
Run Code Online (Sandbox Code Playgroud)
pow之前调用power()函数printf.在你的代码中也是如此,并且会改变原始字符串,因此在printf调用它时,它会获取"在两个参数中"已经被尊重的字符串的地址.
解决此问题的一种方法是分配原始字符串的副本,将其传递给ReverseStr,然后您可以同时使用这两个版本:
int main()
{
char str_unique[] = "abcdthelgko";
char *str_dup = strdup(str_unique);
int str_unique_len = sizeof(str_unique)/sizeof(str_unique[0]);
printf("\n || %s || \n", str_unique);
printf("Orig Str: | %s |, Rev Str | %s |\n", str_unique,
ReverseStr(str_dup, str_unique_len - 1));
free(str_dup); // Don't forget to free the memory allocated by strdup!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |