سؤال

أنا أكتب برنامج C لكنني ما زلت أواجه مشاكل مع مجموعة من chars. ما زلت أحصل على القمامة عند طباعتها باستخدام PRINF. فيما يلي مثال على ما أحصل عليه عند طباعته:

char في T.Symbol هو أ
Char at tabl [0] .Symbol هو
Char at tabl [1] .Symbol هو
Char at tabl [2] .Symbol هو
Char في Tabl [3] .Symbol هو د
Char at tabl [4] .Symbol هو هـ
Char at tabl [5] .Symbol هو f
Char at Tabl [6] .Symbol هو G
Char في Tabl [7] .Symbol هو ح
Char at tabl [8] .Symbol هو أنا
Char at tabl [9] .Symbol هو x
char في t [0] .Symbol A0aã
char في t [1] .Symbol ب)@ã4
char في t [2] .Symbol cku*
char في t [3] .Symbol أ
char في t [4] .Symbol يذهب

هل يمكن لأحد أن يخبرني كيف أتخلص من القمامة في مجموعة من chars؟

ها هو الكود الخاص بي

#define MAX 100
#ifndef SYMBSIZE
 #define SYMBSIZE 1
#endif    

typedef struct tableme 
{
    char symbol[SYMBSIZE];
    int value;
    int casenmbr;
    int otherinfo;
}tabletype;
int main(int argc, char **argv)
{
    tabletype t[MAX];
    t[3].symbol[0] = 'A';

    t[0].value=1;  
    t[0].casenmbr = 7;
    t[0].otherinfo = 682;

    tabletype tabl[MAX];
    tabl[0].value = 1;
    tabl[0].symbol[0] = 'A';
    tabl[1].value = 11;
    tabl[1].symbol[0]= 'a';
    tabl[2].value = 12;
    tabl[2].symbol[0] = 'a';
    tabl[3].value = 13;
    tabl[3].symbol[0] = 'd';
    tabl[4].value = 14;
    tabl[4].symbol[0] = 'e';
    tabl[5].value = 15;
    tabl[5].symbol[0] = 'f';
    tabl[6].value = 16;  
    tabl[6].symbol[0] = 'g';
    tabl[7].value = 17;
    tabl[7].symbol[0] = 'h';
    tabl[8].symbol[0] = 'i';
    tabl[9].symbol[0] = 'x';
    t[1].symbol[0] = 'b';
    t[0].symbol[0]= 'a';
    t[2].symbol[0]= 'c';

    t[4].symbol[0]= 'g';
    printf("char at t.symbol is %s \n", t[3].symbol);

    for( x=0;x<10;x++)
    {
            printf("char at tabl[%d].symbol is %s \n",x, tabl[x].symbol);
    }
    int j;
    for(j = 0; j<5;j++)  
    {
            printf("char at t[%d].symbol is %s \n",j, t[j].symbol);
    }
    return 0;
}
هل كانت مفيدة؟

المحلول

لديك واحدة من مشكلتين محتملين. إذا كنت تريد حقًا شخصية واحدة فقط ، فيجب أن تطبعها %c, ، ليس %s مثله:

printf("char at t.symbol is %c \n", t[3].symbol[0]);

إذا كنت تريد حقًا خيوط عليك تحديدها SYMBSIZE ليكون أعلى 1 من الحد الأقصى لطول الرمز ووضع نول (\0) شار في النهاية. يمكنك أن تفعل ذلك بطريقتين:

  1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
  2. strcpy(tabl[6].symbol, "g");

نصائح أخرى

المشكلة هي أن الأوتار في C تم إنهاءها الخالية. ومع ذلك ، فإن صفيفك كبير فقط بما يكفي لشخصية واحدة ، لذلك لا يمكن أن يتم إنهاءها الفريدة (وهذا يتطلب حرفين على الأقل)

لماذا تحصل على القمامة؟ عندما تقول tabl[0].symbol[0] = 'A';, ، في tabl[0].symbol[0] في الذاكرة لديك A??? ونحن لا نعرف ماذا ??? هو. من الواضح أنه في بعض الأحيان 0 (حيث تحصل على الإخراج الصحيح) ، وأحيانًا لا يكون (القمامة).

لإصلاح هذا ، استخدم %c تنسيق محدد لطباعة حرف واحد بدلا من سلسلة من إنهاء الفرق. إذا كنت ترغب حقًا في طباعة السلاسل ، فأنت بحاجة إلى جعل المخزن المؤقت لسلسلة العنوان أكبر وإنهائه الفريدة:

SYMBSIZE = 10, ، ثم لديك tabl[0].symbol[1] = '\0'; ملاحظة ، عادة ما تريد استخدام وظائف السلسلة:

// copy "a" to that memory location, will be null-terminated.
strcpy(tabl[0].symbol, "a"); 

إذا لم يكن المخزن المؤقت الخاص بك كبيرًا بما يكفي للسلسلة ، فسيتجاوز المخزن المؤقت.

صفائفك ليست كبيرة بما يكفي لتخزين الأوتار فيها. تحتاج إلى مساحة إضافية للشخصية الفارغة. قم بتغيير symbsize إلى 2 أو طباعته على أنه char. أي واحد يجب أن يعمل.

تحرير: أيضًا ، أنت لا تضع chars فارغة على أي حال. ستستمر طباعة السلسلة حتى تصل إلى 0 ، لذلك ستحتاج إلى صنع SYMBSIZE = 2 ثم اجعل symbol[1] = '\0'; من أجل الطباعة كسلسلة.

EDIT2: أو فقط قم بتغييرك %s إلى %c (اطبع char واحد في وقت واحد بدلاً من السلسلة بأكملها)

لطباعة char يجب أن تستخدم ٪ C في printf.

   printf("char at t.symbol is %c \n", t[3].symbol);

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

إذا كنت تريد chars ، فأنت بحاجة إلى استخدام ٪ C وليس ٪ S لطباعة الأحرف.

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);

هناك طريقة لحل المشكلة. في الأساس ، بمجرد تهيئة صفيف char ، يجب علينا تجاوزها بقيمة القمامة إلى NULL. enter code here

void main()
{
    int amsb[10];
    int i,k,i1;
    char arr[25];
    clrscr();
    printf("Enter the 10 element");

    for( i1=0;i1<25;i1++) {
        arr[i1]='\0';
    }

    for( k=0;k<25;k++) {
        printf("%c",arr[k]) ;

        if(arr[k]=='\0')  {
            break;                
        }
    }

    getch();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top