用getchar()输入字符串 转义
时间: 2024-03-23 14:33:09 浏览: 65
```c
#include <stdio.h>
int main() {
char str[100];
int i = 0;
while ((str[i] = getchar()) != '\n') {
i++;
}
str[i] = '\0';
printf("输入的字符串是:%s\n", str);
return 0;
}
```
```c
#include <stdio.h>
int main() {
char str[100];
fgets(str, 100, stdin);
printf("输入的字符串是:%s\n", str);
return 0;
}
```
相关问题
描述 C程序的注释用/*...*/来表示。请写一个程序,将输入的C程序源代码中的注释去掉,输出去掉注释之后的源代码。 用于测试的C代码保证符合语法,不使用C++的//注释语法。 注意,C语言不允许出现嵌套注释。具体来说,对于/*/**/"*/",如果不允许嵌套注释,那么它表示字符串"*/";如果允许嵌套注释,它表示一个引号"。 还请注意,字符串中出现的注释符/*属于字符串的一部分,注释中出现的双引号"属于注释的一部分。 输入 符合语法的C代码文本文件。代码每行不超过200个字符。 输出 去掉注释后的C代码。要求只能去掉注释,不可以做其他的修改,比如调整缩进,去除注释之外的换行符等。 提示 注意字符串,字符,转义字符的情况。 看看自己有没有考虑 "a\"/*ccc*/" 这种情况。
以下是一个可能的解法,使用状态机来处理不同的注释和字符串状态:
```c
#include <stdio.h>
enum State {
NORMAL,
IN_STRING,
IN_COMMENT,
IN_COMMENT_STAR
};
int main() {
enum State state = NORMAL;
char c, prev_c = '\0';
while ((c = getchar()) != EOF) {
switch (state) {
case NORMAL:
if (c == '"') {
state = IN_STRING;
} else if (c == '/' && prev_c == '/') {
// 单行注释
putchar(prev_c);
state = IN_COMMENT;
} else if (c == '/' && prev_c == '*') {
// 结束多行注释
state = NORMAL;
} else if (c == '*') {
state = IN_COMMENT_STAR; // 可能开始多行注释
} else {
putchar(c);
}
break;
case IN_STRING:
putchar(c); // 字符串中的所有内容都不处理
if (c == '"' && prev_c != '\\') {
state = NORMAL;
}
break;
case IN_COMMENT:
if (c == '\n') {
putchar(c);
state = NORMAL;
}
break;
case IN_COMMENT_STAR:
if (c == '/') {
// 结束多行注释
state = NORMAL;
} else if (c == '*') {
// 继续多行注释
state = IN_COMMENT_STAR;
} else {
// 恢复正常状态
state = NORMAL;
putchar(prev_c);
putchar(c);
}
break;
}
prev_c = c;
}
return 0;
}
```
这个程序使用了一个 `enum` 类型来表示不同的状态,并使用 `switch` 语句来根据状态进行处理。在每个状态中,程序根据当前字符和前一个字符的情况来判断是否需要转换状态或输出字符。需要注意的是,对于多行注释中出现的 `*/`,可能需要特殊处理。
#include<stdio.h> #define m 100 struct Mystack { char element[m]; int top; }; void push(struct Mystack *s,char x) /将x的值压入栈顶/ { s->element[s->top]=x; s->top++; } int IsEmpty(struct Mystack *s)//判断栈是否为空 { if(s->top==0) return 1; else return 0; } void pop(struct Mystack *s) /出栈操作,将栈顶元素删除/ { s->top--; } void Displaystack(struct Mystack *s)//显示从栈底到栈顶所有的元素 { int i; for(i=0;i<s->top;i++) printf("%c",s->element[i]); } void Clearstack(struct Mystack *s)//将栈清空 { s->top=0; } void main() { struct Mystack st; char ch; int i; for(i=0;i<100;i++) st.element[i]='\0'; st.top=0; printf("请输入一行字符:\n"); ch=getchar(); while(ch!=EOF && ch!='\n') { switch(ch) { case '#': if(!IsEmpty(&st)) pop(&st); break; case '@': Clearstack(&st); break; default: push(&st,ch); } ch=getchar(); } printf("有效字符为:\n"); Displaystack(&st); printf("\n"); }这段代码有什么问题
这段代码的问题在于`void main()`这个函数的声明方式已经过时了,正确的写法应该是`int main(void)`或`int main(int argc, char *argv[])`;另外,在`printf`函数中,应该使用转义字符`\n`来换行,而不是在字符串后面加上一个空的`printf`语句。修改后的代码如下:
```
#include <stdio.h>
#define m 100
struct Mystack {
char element[m];
int top;
};
void push(struct Mystack *s,char x) //将x的值压入栈顶
{
s->element[s->top]=x;
s->top++;
}
int IsEmpty(struct Mystack *s) //判断栈是否为空
{
if(s->top==0)
return 1;
else
return 0;
}
void pop(struct Mystack *s) //出栈操作,将栈顶元素删除
{
s->top--;
}
void Displaystack(struct Mystack *s) //显示从栈底到栈顶所有的元素
{
int i;
for(i=0;i<s->top;i++)
printf("%c",s->element[i]);
}
void Clearstack(struct Mystack *s) //将栈清空
{
s->top=0;
}
int main(void) {
struct Mystack st;
char ch;
int i;
for(i=0;i<100;i++)
st.element[i]='\0';
st.top=0;
printf("请输入一行字符:\n");
ch=getchar();
while(ch!=EOF && ch!='\n')
{
switch(ch)
{
case '#':
if(!IsEmpty(&st))
pop(&st);
break;
case '@':
Clearstack(&st);
break;
default:
push(&st,ch);
}
ch=getchar();
}
printf("有效字符为:\n");
Displaystack(&st);
printf("\n");
return 0;
}
```
此外,还可以添加输入字符长度的限制,以防止输入字符长度超出栈的容量而导致程序崩溃,例如可以在定义栈的结构体时增加一个`size`表示栈的容量,然后在`push`函数中加入如下代码:
```
if (s->top >= s->size) {
printf("栈已满!\n");
return;
}
```
在`main`函数中也需要修改为如下的形式:
```
struct Mystack st;
char ch;
int i;
st.size = m;
```
这样就可以避免因为输入字符长度过长而导致的程序崩溃问题。
阅读全文