إزالة علامات الترقيم في سلسلة في C باستخدام حالة التبديل

0

هل يمكن لشخص أن يساعدني ويروي ما هو الخطأ في التعليمات البرمجية الخاصة بي. لقد صنعت الحل باستخدام علبة التبديل واستبدلت علامات الترقيم بسلسلة فارغة.

#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;
}

3 الاجابة

1
افضل جواب
  1. strcpy(st[i]," ") هو استخدام خاطئ st[i]=' ' ؛ (strcpy هو لنسخ السلاسل ، حالة حالة حرف مباشر واحد هو العملية) .
  2. gets(st) تمت إزالة الآن من C .تسبب buffer overflows . استعمال fgets() . اقرأ المزيد عن () و fgets ()

هنا يمكن أن تحل محل gets() باستخدام fgets() بواسطة :-

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;
}

الموصى بها: - نقل puts() في الخارج for-loop .

انتاج :-

ENter the string:
!hello#%worl$
String is:
 hello#%worl$

String is:
 hello#%worl$

String is:
 hello#%worl$

String is:
 hello#%worl$

String is:
 hello#%worl$

String is:
 hello#%worl$

String is:
 hello %worl$

String is:
 hello  worl$

String is:
 hello  worl$

String is:
 hello  worl$

String is:
 hello  worl$

String is:
 hello  worl$

String is:
 hello  worl 

String is:
 hello  worl 
:مؤلف
0

الكود المقترح التالي:

  1. يجمع بشكل نظيف
  2. يلغي الأرقام "السحرية"
  3. استبدال علامات الترقيم المدرجة بمسافة
  4. طباعة النتيجة مرة واحدة فقط
  5. يستخدم الوظيفة "الصالحة" fgets() بدلاً من (غير موجود) حاليًا gets() وظيفة
  6. تجنب مقارنة القيم الموقعة وغير الموقعة
  7. يحد من نطاق المتغير 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;
}
:مؤلف
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;
        }
:مؤلف
فوق
قائمة طعام