C برمجة. قراءة المدخلات وتحليل ذلك في كلمات

StackOverflow https://stackoverflow.com/questions/1407872

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أكتب برنامج صغير في C من شأنها أن قراءة المدخلات من وحدة التحكم. ثم وضعها في مجموعة وشار. بعد ذلك ولست بحاجة لتقسيم مجموعة في كلمات. لست متأكدا من كيفية القيام بذلك. حتى الآن لقد وضعت المدخلات إلى مجموعة شار. أريد أن أعرف إذا كان هناك وسيلة لtokenize على أساس حرف فارغة. أو أي اقتراحات أخرى حول كيفية التعامل مع هذه المشكلة. شكرا.

وعينة:

والمدخلات: هذا مجرد اختبار

ومجموعة: [ر، ح، ط، ق،، ط، ق،، س، ن، ل، ص،، لذلك، ر، ه، ق، ر، لاغية]

وأود أن الحصول على مجموعة سلسلة [هذا، هو، فقط، لذلك، اختبار، لاغية]

main() {

    char msg[50], ch;
    int i = 0;

    printf("***Reading words in your input*****\n\n");
    printf("Type something terminated by ENTER button\n");

    while ((ch = getchar()) != '\n')
        msg[i++] = ch;

    msg[i] = '\0';

    i = 0;

    while (msg[i] != '\0')
        putchar(msg[i++]);
    printf("\n");

}
هل كانت مفيدة؟

المحلول

نعم، استخدم الدالة strtok:

char* token = strtok(msg, " ");
while (token != NULL) {
  printf("%s", token);
  token = strtok(NULL, " ");
}

نصائح أخرى

إذا كنت ترغب في قراءة كل الكلمات حتى نهاية الملف (عدم التوقف عند السطر الجديد)، ثم وهذا هو أبسط:

#include <stdio.h>
int main(){
    char b[999];
    while (scanf("%s",b)==1)
        puts(b);
    return 0;
}

والقيمة عودة scanf هو عدد الحقول تحليل بنجاح، أو EOF. يقدم بيضاء لفصل "٪ ليالي" الميادين، حتى تحصل على الرموز التي تريدها. بالطبع، إذا كنت لا تقرأ الخط الأول، يمكنك الاستمرار في استخدام sscanf.

إذا كنت تريد أن تتراكم مجموعة من السلاسل بدلا من مجرد معالجة واحدة تلو الأخرى ( "يضع (ب)" أعلاه)، ثم ستحتاج إلى الحصول على أيديكم القذرة مع realloc، malloc، strcpy، وstrlen. مخازن الحجم الثابتة هي سيئة على أي حال.

وC لايوجد سلاسل بمعنى استخدام كلمة. C لديها صفائف حرفا.

إذا كنت تريد مجموعة من السلاسل ... هل يمكن أن يكون شيئا من هذا القبيل باعتبارها مجموعة من صفائف حرف.

ولكن كل مجموعة لديها حجم محدد مسبقا، وأنت لا يمكن إضافة المزيد من "السلاسل" أو جعلها أطول من المساحة المتوفرة. الخيار الآخر (بدلا من صفائف صفائف شار) هو استخدام المؤشرات والذاكرة من malloc () والأصدقاء (سأترك مناقشة poonters، malloc () والأصدقاء لوقت آخر).

لتحديد مجموعة من مجموعة من شار وتقسيم الجملة من مسافات، يمكنك القيام بذلك

char array_of_string[10][6]; /* 10 strings of a maximum of 5 characters each, plus the NUL */
char msg[50] = "this is a test";
/* now split the msg and put the words in array_of_string */
int string_num = 0;
int word_size = 0;
int msg_index = 0;

while (msg[msg_index] != '\0') {
    if (msg[msg_index] != ' ') {
        /* add the character to the proper place in array_of_string */
        array_of_string[string_num][word_size] = msg[msg_index];
        /* and update word_size for next time through the loop */
        word_size++; /* needs check for reserved word size (5) */
    } else {
        /* a space! */
        /* first, terminate the current word */
        array_of_string[string_num][word_size] = '\0';
        /* prepare to start the next word */
        string_num++; /* needs check for reserved number of "strings" (10) */
        word_size = 0;
    }
}
/* array_of_string[0] is now "this"
 * array_of_string[1] is now "is"
 * ...
 */
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top