Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针之谜/noobish问题_C_Pointers - Fatal编程技术网

C 指针之谜/noobish问题

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

我最初是一名Java程序员,现在正努力使用C语言,特别是C语言的指针

我的想法是在命令行上接收来自用户的字符串,并将其转换为字符指针。然后我想访问它的各个元素。后来的想法是设计一个函数来反转元素的顺序。(我想处理文本中的字谜。)

我的代码是

#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...