【发布时间】:2016-01-20 16:43:42
【问题描述】:
我正在练习面试。我目前遇到的问题是在 C 中反转一个常量字符串。我知道由于 str2 是 const,我可以修改 str2 指向的位置,但不能修改它的值。我在下面有一个名为 reverse_const 的函数。它将反转 const char *str_const 并打印它。但是,当我尝试从 main 方法反转后打印 st2 时,字符串不再反转。它就像 reverse_const() 是临时改变 str2 的内存位置。我在这里做错了什么?
#include <stdio.h>
#include <string.h>
void reverse(char *str){
int c_size = strlen(str);
char *c_begin = str, *c_end = str + (c_size - 1);
int i;
for(i = 0; i < c_size / 2; i++){
*c_begin ^= *c_end;
*c_end ^= *c_begin;
*c_begin ^= *c_end;
c_begin++;
c_end--;
}
}
void reverse_const(const char *str_const){
int c_size = strlen(str_const);
char str[c_size];
strcpy(str, str_const);
char *c_begin = str, *c_end = str + (c_size - 1);
int i;
for(i = 0; i < c_size / 2; i++){
*c_begin ^= *c_end;
*c_end ^= *c_begin;
*c_begin ^= *c_end;
c_begin++;
c_end--;
}
str_const = str;
printf("%s\n", str_const);
}
int main(){
char str1[] = "Indiana";
char *str2 = "Kentucky";
printf("TESTS:\nString 1 pre-reversal: %s\n", str1);
reverse(str1);
printf("String 1 post-reversal: %s\n", str1);
printf("Constant string 2 pre-reversal: %s\n", str2);
reverse_const(str2);
printf("Constant string 2 post-reversal: %s\n", str2);
}
【问题讨论】:
-
char str[c_size];不足以容纳长度为c_size的 nul-terminated 字符串。 -
我在这里做错了什么?你没有做任何改变
str2指向的地方。你已经发现你需要改变它指向的位置来解决这个问题......但是上下文也很重要!str_const = str;对str2没有影响,这是在main()s 上下文中。 -
"我可以修改 str2 指向的位置" 如果该位置不变,则不会。指针不是数组或字符串(数组也不是字符串)。请阅读一本好的 C 书籍中有关指针、数组和字符串文字的内容。
-
@Olaf 也许我应该说“我可以更改 str2 指向的地址,但不能更改原始地址的值。”?
-
str2(使用标记!)不指向地址。您可以更改的只是它自己的给定值。而str2仍然是不是字符串!既不是常量也不是非常量!忘记那个更难阅读/理解的异或交换。使用临时变量并将其放入自己的函数中。使它成为static很可能会使编译器自动内联它。这不会变慢。
标签: c pointers pass-by-reference