C 指针之谜/noobish问题
我最初是一名Java程序员,现在正努力使用C语言,特别是C语言的指针 我的想法是在命令行上接收来自用户的字符串,并将其转换为字符指针。然后我想访问它的各个元素。后来的想法是设计一个函数来反转元素的顺序。(我想处理文本中的字谜。) 我的代码是C 指针之谜/noobish问题,c,pointers,C,Pointers,我最初是一名Java程序员,现在正努力使用C语言,特别是C语言的指针 我的想法是在命令行上接收来自用户的字符串,并将其转换为字符指针。然后我想访问它的各个元素。后来的想法是设计一个函数来反转元素的顺序。(我想处理文本中的字谜。) 我的代码是 #include <stdio.h> char *string; int main(void) { printf("Enter a string: "); scanf("%s\n",string); putchar(*string);
#include <stdio.h>
char *string;
int main(void)
{
printf("Enter a string: ");
scanf("%s\n",string);
putchar(*string);
int i;
for (i=0; i<3;i++)
{
string--;
}
putchar(*string);
}
#包括
字符*字符串;
内部主(空)
{
printf(“输入字符串:”);
scanf(“%s\n”,字符串);
putchar(*字符串);
int i;
对于(i=0;i您尚未为字符串分配空间。您将需要以下内容:
char string[1024];
您也不应该递减变量字符串
。如果它是一个数组,您不能这样做
你可以简单地做:
putchar(string[i]);
或者可以使用指针(指向建议的数组):
或者干脆写:
putchar(*(str+3));
等等
您应该检查scanf()
是否成功。您应该限制输入字符串的大小以避免缓冲区(堆栈)溢出:
if (scanf("%1023s", string) != 1)
...something went wrong — probably EOF without any data...
<> >注意<代码> %s>代码>跳过引导的空白空间,然后读取字符到下一个空白空间(“Word”的简单定义)。将新行添加到格式字符串几乎没有差别。您可以考虑“代码>”% 1023 [^ \n\\n“< /COD>”;查找最多1023个非新行,后面是换行符。
您应该从避免全局变量开始。有时,它们是必需的,但在本例中不是。另一方面,使用scanf(3)是一种不好的做法。您可能需要研究fgets(3)或类似的函数,以避免与scanf(3)相关联的常见陷阱.如果你仔细阅读这些书,它们不会被证明是无用的。非常有价值-谢谢!但是你的解决方案将我限制在一个具有预定大小的常规字符数组中。我认为C允许在运行时使用“char*string”方案来解决这个问题,而字符串的大小没有声明?或者你实际上可以排除这个想法吗?因为在这种情况下,我会同意你的建议,不担心我会跳过代码使用中令人讨厌和困难的部分。是的,你可以使用动态分配的内存(使用malloc()
等
)或者,您可以使用指向分配在某处的其他内存的指针。您的问题之一是string
被初始化为零或null,这保证是无效指针(通常,如果您试图通过null指针读取或写入,您的程序会崩溃)对于任何指针,都必须知道它指向某个地方,以及这个空间有多大。在C语言中不会发生任何神奇的内存分配;您负责内存分配。
putchar(*(str+3));
if (scanf("%1023s", string) != 1)
...something went wrong — probably EOF without any data...