操作系统:mac
编译器:vscode
情境:删除给定字符串中的数字字符
程序:见下方⬇️
提问:
1.为何会出现trace trap?
2.如何在仍使用strcpy()的情况下,进行修正?
附加要求(能做到最好):希望回答语言可以偏平实,我是刚学完指针,开始学字符串的大一新生,谢谢您
#include<stdio.h>
#include<string.h>
char *delnum(char *s);
void main()
{
char string[10];
printf("input string:\n");
gets(string);
puts(delnum(string));
}
char *delnum(char *s)
{
int i;
char *temp=s;
for(i=0;s[i]!='\0';)
{
if(s[i]>='0' && s[i]<='9')
{
strcpy(s,s+1);
}
else s++;
}
return temp;
}
vscode上运行结果:
(1)void main改成 int main,并在main函数最后 return 0;
(2)第15行 for(i=0;s[i]!='\0';)这里,改成 while(*s != '\0')
修改方法一:
#include<stdio.h>
#include<string.h>
char *delnum(char *s);
int main()
{
char string[10];
printf("input string:\n");
gets(string);
puts(delnum(string));
return 0;
}
char *delnum(char *s)
{
int i;
char *temp=s;
while(*s != '\0')
{
if(*s>='0' && *s<='9')
{
strcpy(s,s+1);
}
else s++;
}
return temp;
}
修改方法二:
#include<stdio.h>
#include<string.h>
char *delnum(char *s);
int main()
{
char string[10];
printf("input string:\n");
gets(string);
puts(delnum(string));
return 0;
}
char *delnum(char *s)
{
int i=0,j=0;
while(s[i] != '\0')
{
if(s[i]>='0' && s[i]<='9')
{
;//do nothing
}
else
s[j++]=s[i];
i++;
}
s[j]=0;
return s;
}
把主函数void main改成int main就不报错了。.你后面有返回return,
因为你定义的是一个10个字符的数组,所以注意数组越界的问题,输入的时候字符串中字母个数要小于10
#include<stdio.h>
#include<string.h>
char *delnum(char *s);
int main()
{
char string[10];
printf("input string:\n");
gets(string);
puts(delnum(string));
return 0;
}
char *delnum(char *s)
{
int i;
char *temp=s;
for(i=0;s[i]!='\0';)
{
if(s[i]>='0' && s[i]<='9')
{
strcpy(s + i, s + i + 1);
}
else i++;
}
return temp;
}
运行结果:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
string n;
int main(){
cin>>n;
for(int i=0;i<n.size();i++){
if(n[i]!='0'&&n[i]!='1'&&n[i]!='2'&&n[i]!='3'&&n[i]!='4'&&n[i]!='5'&&n[i]!='6'&&n[i]!='7'&&n[i]!='8'&&n[i]!='9')cout<<n[i];
}
return 0;
}