指向字符数组的第一个字符的指针?

时间:2012-05-30 23:33:59

标签: c pointers

编辑:显然我必须先在pigLatin方法的开头声明char *,然后在方法中稍后将其初始化为& word [counter]。谁知道为什么会这样?我正在使用Visual Studio 2010。

我无法弄清楚为什么这会给我一个编译时错误。有问题的代码:

#include <stdio.h>
#include <string.h>
#include <conio.h>

char *pigLatin(char *word)
{
   if (word[0] == 'a' || word[0] == 'e' || word[0] == 'i'
           || word[0] == 'o' || word[0] == 'u')
   {
       char yay[] = "yay";
       strcat(word, yay);
       return word;
   }
   else
   {
       int length = strlen(word);
       int counter = 0;
       char addOn[] = "";
       char remainder[] = "";
       char yay[] = "yay";
       printf("%s", yay);

       char *first = &word[counter]; 
       printf("%c", *first); // error is here, don't know why it doesn't print
       return word;
   }
}


int main()
{
   char hello[] = "hello";
   pigLatin(hello);
   printf("%s", hello);
   getch();
   return (0);
}

1&gt; ------ Build build:Project:Program_One,Configuration:Release Win32 ------

1&GT; programone.c

1&gt; programone.c(12):警告C4996:'strcat':此函数或变量可能不安全。请考虑使用strcat_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。

1&gt; programone.c(24):错误C2143:语法错误:缺少';'在'type'之前

1&gt; programone.c(25):错误C2065:'first':未声明的标识符

1&gt; programone.c(25):错误C2100:非法间接

==========构建:0成功,1失败,0最新,0跳过==========

我不明白为什么我指向数组“hello”的第一个字符的指针无法正确打印。

提前致谢!

4 个答案:

答案 0 :(得分:3)

您没有将指针变量指定为指向第一个字符的地址。您将字符本身的值赋给指针变量,这就是编译器错误的原因。

您需要更改此行:

char *first = word[counter]; 

对此:

char *first = &word[counter]; 

或者,只需这样做:

char *pigLatin(char *word)   
{   
    int counter = 0;   
    printf("%c", word[counter]);
    return word;   
}   

更新:即使代码编译完成,也很危险。有关strcat()的编译器警告有效。如果输入字以元音开头,则您没有分配足够的内存来将"yay"附加到输入字。要真正使代码更安全,您应该使用std::string类而不是原始指针:

#include <conio.h> 
#include <string> 

std::string pigLatin(const std::string &word) 
{ 
    switch( word[0] )
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u': 
            return word + "yay"; 
    }

    int length = word.length(); 
    int counter = 0; 
    //...

    printf("%c", word[counter]);
    return word; 
} 

int main() 
{ 
   std::string word = pigLatin("hello");
   printf("%s", hello.c_str()); 
   getch(); 
   return 0; 
} 

答案 1 :(得分:2)

这一行:

char *first = word[counter]; 

应改为:

char *first = &word[counter];

由于您指向指针所指向的值而不是内存地址本身,因此要获得实际值,您需要在数组调用前签署&符号。

答案 2 :(得分:1)

您当前正在告诉编译器将first指向word[counter]的值,这意味着它指向内存中某个奇怪的地方。您希望指向数组的第一个元素,因此需要替换:

char *first = word[counter];

使用:

char *first = &word[counter];

或:

char *first = word;

编辑 - 您在评论中提到的编译器错误与第23行和第23行有关。 24源代码。您在上面发布的示例中少于23行。因此,恐怖必须包含一些您未在此处发布的额外代码......

Edit2 - 经过一些小的调整,您的代码看起来对我有用:http://codepad.org/73BKMSgv

答案 3 :(得分:0)

char str [] =“test”;
char * p;
p = str;
的printf(P [0]);

输出: