使用开关大小写删除C中字符串中的标点
有人能帮我告诉我我的代码有什么问题吗。我使用switch-case来解决这个问题,并用空字符串替换标点符号使用开关大小写删除C中字符串中的标点,c,arrays,string,loops,switch-statement,C,Arrays,String,Loops,Switch Statement,有人能帮我告诉我我的代码有什么问题吗。我使用switch-case来解决这个问题,并用空字符串替换标点符号 #include<stdio.h> #include<string.h> int main() { char st[50]; int i; printf("ENter the string:\n"); gets(st); for(i=0;i<strlen(st);i++) { sw
#include<stdio.h>
#include<string.h>
int main()
{
char st[50];
int i;
printf("ENter the string:\n");
gets(st);
for(i=0;i<strlen(st);i++)
{
switch(st[i])
{
case '!':
case '"':
case '#':
case '$':
case '%':
case '&':strcpy(st[i]," ");
break;
}
printf("String is:\n");
puts(st);
}
return 0;
}
#包括
#包括
int main()
{
char-st[50];
int i;
printf(“输入字符串:\n”);
获取(st);
对于(i=0;i
strcpy(st[i],”)
使用错误st[i]=''
;(strcpy用于复制字符串,如果是单字符直接赋值,则为过程)
get(st)
现在从C
中删除。它会导致缓冲区溢出
。请使用fgets()
这里可以使用fgets()
替换gets()
:-
fgets(st,50,stdin);
修改代码:-
#include <stdio.h>
#include <string.h>
int main()
{
char st[50];
int i;
printf("ENter the string:\n");
fgets(st, 50, stdin);
for (i = 0; i < strlen(st); i++)
{
switch (st[i])
{
case '!':
case '"':
case '#':
case '$':
case '%':
case '&':
st[i] = ' ';
break;
}
printf("String is:\n");
puts(st);
}
return 0;
}
“”是一个空格。我认为这不是您的预期行为。请使用另一个缓冲区进行复制。例如
#include<stdio.h>
#include<string.h>
int main()
{
char sta[50];
char stb[50];
int i,j;
printf("ENter the string:\n");
gets(sta);
for(i=0,j=0;i<strlen(sta);i++)
{
switch(st[sta])
{
case '!':
case '"':
case '#':
case '$':
case '%':
case '&': break;
default:
stb[j++]=sta[i];
break;
}
stb[j] = (char)0; // C str termination...
printf("String is:\n");
puts(stb);
}
return 0;
}
#包括
#包括
int main()
{
char-sta[50];
字符机顶盒[50];
int i,j;
printf(“输入字符串:\n”);
获取(sta);
对于(i=0,j=0;i以下建议代码:
#include<stdio.h>
#include<string.h>
#define MAX_STR_LEN 50
int main( void )
{
char st[ MAX_STR_LEN + 1 ];
printf("ENter the string, max 50 characters\n");
fgets( st, sizeof( st ), stdin );
for( size_t i=0;i<strlen(st);i++)
{
switch(st[i])
{
case '!':
case '"':
case '#':
case '$':
case '%':
case '&':
st[i] = ' ';
break;
default:
break;
}
}
printf( "Modified String is:\n %s\n", st );
return 0;
}
干净地编译
消除“神奇”数字
用空格正确替换列出的标点符号
只打印一次结果
使用“有效”函数fgets()
而不是(当前)不存在的gets()
函数
避免比较有符号值和无符号值
限制变量i
现在,拟议的守则:
#include<stdio.h>
#include<string.h>
#define MAX_STR_LEN 50
int main( void )
{
char st[ MAX_STR_LEN + 1 ];
printf("ENter the string, max 50 characters\n");
fgets( st, sizeof( st ), stdin );
for( size_t i=0;i<strlen(st);i++)
{
switch(st[i])
{
case '!':
case '"':
case '#':
case '$':
case '%':
case '&':
st[i] = ' ';
break;
default:
break;
}
}
printf( "Modified String is:\n %s\n", st );
return 0;
}
#包括
#包括
#定义最大长度50
内部主(空)
{
char st[MAX_STR_LEN+1];
printf(“输入字符串,最多50个字符”);
fgets(st、sizeof(st)、stdin);
对于(sisixt t=0;为什么要使用<代码> StrucP</Case>一个字符?为什么不使用CASE或逻辑的结束?为什么不使用或逻辑,即短可以是if语句。Rusty在我的C++上,一直在看C和它的不同。<代码> StrucP< /Calp>会将空白和空终止符复制到Src中指定的位置,这在您的CA中是正确的。se甚至不是一个好的地址。您应该更改:strcpy(st[i],”;
=>st[i]='';
。您的交换机应该有一个默认的情况,只是会中断。另外,编译时打开警告,因为它们会通知您错误。函数:get()
已经贬值多年,在C标准C11Close中完全从C语言中删除。'
是一个空格。'
是一个字符串文本。这个答案使用标点字符而不是字母构建stb[]
。很抱歉,我错过了一些东西。编辑。for(I=0;I将调用<代码> STRULN()/代码> n次,每次调用花费n次迭代-使此代码为O(n*n)。考虑<代码>为(i=0;ST[i];i++)< />代码。输出打印时间仍然淹没任何这样的改进。PS -您有一个无法修复的键入,因为它小于六个字符。您称“fgTSH”(而不是“fgsSh”)-“GET(ST))。现在已从C中删除。它会导致缓冲区溢出。请使用fegts()。阅读有关gets()和fgets()的详细信息“@torstenvl感谢您的通知。我已更改。