0

编辑:显然我必须在 pigLatin 方法的开头声明 char *first 并稍后在该方法中将其初始化为 &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>----- 构建开始:项目:Program_One,配置:发布 Win32 ------

1>programone.c

1>programone.c(12): 警告 C4996: 'strcat': 这个函数或变量可能不安全。考虑改用 strcat_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。

1>programone.c(24): 错误 C2143: 语法错误: 缺少';' 在“类型”之前

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

1>programone.c(25): 错误 C2100: 非法间接

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

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

提前致谢 !

4

4 回答 4

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; 
} 
于 2012-05-30T23:40:25.077 回答
2

这一行在这里:

char *first = word[counter]; 

应该是这个:

char *first = &word[counter];

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

于 2012-05-30T23:40:45.917 回答
1

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

char *first = word[counter];

和:

char *first = &word[counter];

或者:

char *first = word;

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

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

于 2012-05-30T23:39:25.530 回答
0

字符 str[] = "测试";
字符* p;
p = str;
printf(p[0]);

输出:

于 2015-01-19T19:19:29.037 回答