【问题标题】:Pointer to the first character of a character array?指向字符数组的第一个字符的指针?
【发布时间】:2015-01-20 03:19:29
【问题描述】:

编辑:显然我必须在 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' : undeclared identifier

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

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

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

提前致谢!

【问题讨论】:

  • 如果您将编译器的警告级别调高,您应该会发现它无法编译(或者您至少应该收到警告消息)。
  • 不应该是&amp;word[counter]
  • @OliCharlesworth:这就是我得到的。具体错误是: 1>programone.c(23): error C2143: syntax error : missing ';'在“类型”之前 1>programone.c(24):错误 C2065:“第一个”:未声明的标识符 1>programone.c(24):错误 C2100:非法间接
  • @BeemerGuy.net:我试过了,但仍然出现构建错误。
  • @kkSlider:真的吗? works for me

标签: c pointers


【解决方案1】:

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

你需要改变这一行:

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; 
} 

【讨论】:

  • 我这样做并得到这些错误:>programone.c(23): error C2143: syntax error: missing ';'在“类型”之前 1>programone.c(24):错误 C2065:“第一个”:未声明的标识符 1>programone.c(24):错误 C2100:非法间接
  • @kkSlider:试试这个代码:ideone.com/nY6f4,这是 Remy 对您的代码进行更改的结果。并且还删除了特定于 DOS 的行,只是为了让它在 ideone 上编译,但它们应该与您报告的错误消息无关。
  • @kkSlider:那么您犯了另一个错误,上面的示例代码中没有显示。如果我将这些建议中的任何一个应用于您的原始代码,它就会在 MSVC++ 2010 中正确编译和运行。
  • @SteveJessop 是的,确实可以。我将编辑我的原始帖子并将整个代码放入错误中。
  • @kkSlider:愚蠢的 C89,块中的所有变量定义必须在所有语句之前。从某种意义上说,您“不应该”为 C 使用 MS 编译器:MS 不鼓励这样做。现代编译器使用 C99 并考虑 C11。
【解决方案2】:

这里的这一行:

char *first = word[counter]; 

应该是这个:

char *first = &word[counter];

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

【讨论】:

    【解决方案3】:

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

    char *first = word[counter];
    

    与:

    char *first = &word[counter];
    

    或:

    char *first = word;
    

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

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

    【讨论】:

    • 是的,我将原始代码剥离到发生错误的位置,以便查看者不需要看到无关代码。现在我知道这是一个坏主意并修复了我原来的帖子。
    • 我认为我使用的是旧版本的 C 编译器,因为它仍然会给我一个编译器错误,除非我在方法的开头声明我的变量。我使用的是最新版本的 Visual Studio (2010),所以我不明白为什么会出现这个问题。
    【解决方案4】:

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

    输出:
    t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2021-06-22
      • 2021-06-28
      • 2017-07-19
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多