Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用开关大小写删除C中字符串中的标点_C_Arrays_String_Loops_Switch Statement - Fatal编程技术网

使用开关大小写删除C中字符串中的标点

使用开关大小写删除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

有人能帮我告诉我我的代码有什么问题吗。我使用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++)
    {
        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感谢您的通知。我已更改。