2013-06-20 33 views
0

我在与我和我不可以与下面的代码数组和指针做的事情烦恼: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阵列更优雅的方式来循环?

回答

4

我该如何重新编写for循环而不必使用幻数 (本例中为4)?这样做的

的一种方式,是给你迭代阵列,例如在添加special终止值(通常NULL

char *v[] = { a, b, c, d, NULL }; 

for(count = 0; v[count] != NULL; ++count) 
    printf("%s",v[count]); 
+0

谢谢,这作品!作为一个侧面问题,当我写* [v] = {a,b,c,d}或{a,b,c,d,'\ 0'}或{a,b,c,d,NULL}时, strlen(v)给我3而不是4.为什么? – ericgrosse

+0

现在它给了我85的长度,尽管我根本没有更改代码......我讨厌非确定性错误:/ – ericgrosse

+0

@ amalgam54。你不能使用'strlen(v)',它的行为在你的情况下是不确定的。当你编译这个时,你应该得到一个很大的警告(或者错误,取决于你的编译器设置)。 'v'不是'char指针'(字符串),它是'char指针'(字符串)的数组。一个体面的编译器会标记这个。 –

1
char *v[] = { a, b, c, d}; 
int size = sizeof(v)/sizeof(*v);//4