编辑:显然我必须先在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”的第一个字符的指针无法正确打印。
提前致谢!
答案 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]);
输出:
吨