我最初是一名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书和参考手册都证明是无用的。
答案 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)相关的常见陷阱。