指针神秘/ noobish问题

时间:2012-09-09 02:00:04

标签: 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);

}

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

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

2 个答案:

答案 0 :(得分:7)

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

char string[1024];

您也不应该减少变量string。如果是数组,则不能这样做。

你可以这样做:

putchar(string[i]);

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

char *str = string;

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

putchar(*str);

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

str += 3;

或简单地写:

putchar(*(str+3));


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

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

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

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

答案 1 :(得分:0)

另一方面,使用scanf(3)是不好的做法。您可能需要查看fgets(3)或类似的函数,以避免与scanf(3)相关的常见陷阱。