3

我最初是一名 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() 之后),则内容 *string 应该是 S。如果我不知道,指针应该恰好设置在 '\0'在 scanf() 之后,备份几个步骤(字符串 - 重复)应该会以带有 *string 的字符的方式产生一些东西。但是,这两个 putchar() 都会产生分段错误。

我在做一些根本上错误的事情,而一些根本性的事情已经逃脱了我。对于我的缺点的任何建议,我将永远感激不尽,最重要的是任何说明这些特殊问题的书籍/资源的提示。就这一点而言,两本厚厚的 C 书和参考手册已被证明毫无用处。

4

2 回答 2

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跳过前导空格,然后将字符读取到下一个空格(“单词”的简单定义)。将换行符添加到格式字符串几乎没有什么区别。你可以考虑"%1023[^\n]\n";最多可查找 1023 个非换行符,后跟一个换行符。

您应该开始避免使用全局变量。有时,它们是必要的,但在此示例中并非如此。

于 2012-09-09T02:08:05.327 回答
0

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

于 2012-09-09T13:10:37.853 回答