我原来是一名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书和参考手册都没用.
您尚未为字符串分配空间.你需要这样的东西:
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个非换行符后跟换行符.
你应该开始避免全局变量.有时候,它们是必要的,但不是在这个例子中.