我在与我和我不可以与下面的代码数组和指针做的事情烦恼:K&R在交换功能阵列和指针有效输入
#include <stdio.h>
#define MAX 1000
void swap (char *v[], int i, int j);
main() {
int i = 1, j = 2;
int count;
char *a = "Bill ", *b = "went ", *c = "to the ", *d = "grocery store.";
char *v[MAX];
v[0] = a;
v[1] = b;
v[2] = c;
v[3] = d;
printf("String before swapping elements at index %d and %d: \n",i,j);
for(count = 0; count < 4; ++count)
printf("%s",v[count]);
printf("\n");
swap(v,i,j);
printf("String after swapping elements at index %d and %d: \n",i,j);
for(count = 0; count < 4; ++count)
printf("%s",v[count]);
printf("\n");
system("Pause");
return 0;
}
void swap (char *v[], int i, int j)
{
char *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
两件事情来介意:
为什么在声明*v[MAX]
之后我不能写v[] = {a,b,c,d}
?事实上,我做了一个简单的测试,甚至这是不允许的:
char v[MAX];
v[] = {'w','o','r','d','s'};
而char v[] = {'w','o','r','d','s'};
被接受。这是为什么?
第二件事,我如何重写for循环而不必使用幻数(在本例中为4)?我尝试过以各种方式使用strlen,但每次都遇到错误。我能想出的最好的是宣布char *k;
和改变环路条件
for(count = 0, k = v; *(k-1); ++count, ++k)
printf("%s",v[count]);
的有些笨拙的解决方案肯定有必须通过V阵列更优雅的方式来循环?
谢谢,这作品!作为一个侧面问题,当我写* [v] = {a,b,c,d}或{a,b,c,d,'\ 0'}或{a,b,c,d,NULL}时, strlen(v)给我3而不是4.为什么? – ericgrosse
现在它给了我85的长度,尽管我根本没有更改代码......我讨厌非确定性错误:/ – ericgrosse
@ amalgam54。你不能使用'strlen(v)',它的行为在你的情况下是不确定的。当你编译这个时,你应该得到一个很大的警告(或者错误,取决于你的编译器设置)。 'v'不是'char指针'(字符串),它是'char指针'(字符串)的数组。一个体面的编译器会标记这个。 –