指针神秘/ noobish问题

San*_*ana 3 c pointers

我原来是一名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);

}
Run Code Online (Sandbox Code Playgroud)

(对不起,代码标记不起作用).我想要做的是第一次访问个别元素.如果字符串是"Santillana"并且指针设置在最开头(在scanf()之后),则content*字符串应该是S.如果我不知道指针应该恰好设置在'\ 0'在scanf()之后,备份几个步骤(字符串 - 重复)应该产生一些带有*string的字符.但是这两个putchar()都会产生分段错误.

我正在做一些根本错误的事情,一些基本的东西逃过了我.我会永远感激任何关于我的缺点的建议,最重要的是任何有关这些特殊问题的书籍/资源提示.事实证明,两本厚厚的C书和参考手册都没用.

Jon*_*ler 7

您尚未为字符串分配空间.你需要这样的东西:

char string[1024];
Run Code Online (Sandbox Code Playgroud)

你也不应该减少变量string.如果是阵列,则不能这样做.

你可以这样做:

putchar(string[i]);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用指针(到建议的数组):

char *str = string;

for (i = 0; i < 3; i++)
    str++;

putchar(*str);
Run Code Online (Sandbox Code Playgroud)

但是你可以将这个循环缩短为:

str += 3;
Run Code Online (Sandbox Code Playgroud)

或者简单地写:

putchar(*(str+3));
Run Code Online (Sandbox Code Playgroud)

等等.


你应该检查一下scanf()是否成功.您应该限制输入字符串的大小以避免缓冲区(堆栈)溢出:

if (scanf("%1023s", string) != 1)
    ...something went wrong — probably EOF without any data...
Run Code Online (Sandbox Code Playgroud)

请注意,%s跳过前导空白区域,然后读取字符直到下一个空白区域("word"的简单定义).将换行添加到格式字符串几乎没有区别.你可以考虑一下"%1023[^\n]\n"; 查找最多1023个非换行符后跟换行符.

你应该开始避免全局变量.有时候,它们是必要的,但不是在这个例子中.

  • 是的,您可以使用动态分配的内存(使用`<stdlib.h>`中的`malloc()`等),也可以使用指向某处分配的其他内存的指针.你的一个麻烦是`string`被初始化为零或null,这被保证是一个无效的指针(通常,如果你试图读取或写入空指针,你的程序崩溃).对于任何指针,知道它指向某个地方,以及该空间有多大是至关重要的.在C中没有发生的是任何神奇的内存分配; 你负责内存分配. (3认同)