मैं कुछ घंटों के लिए सी में मोर्स कोड कनवर्टर के लिए वास्तव में सरल स्ट्रिंग को कोड करने का प्रयास कर रहा हूं और अंत में मुझे बिना किसी चेतावनी के संकलन करने के लिए मिला। मैं सी में एक नौसिखिया हूं इसलिए मैं वास्तव में समझ नहीं पा रहा हूं कि मेरा कोड कैसे ठीक किया जाए। मेरा मानना ​​​​है कि समस्या यह होनी चाहिए कि मैं पॉइंटर्स और इत्यादि के साथ स्ट्रिंग कैसे पास करता हूं, क्योंकि यह वह हिस्सा है जिसे मैं सबसे ज्यादा समझ नहीं पा रहा हूं। मुझे इसे कैसे करना है, इस पर एक उदाहरण मिला, लेकिन मैं अभी भी इसे समझ नहीं पाया, और कोई विशिष्ट मामला नहीं था जो मेरे जैसा होगा, क्योंकि मैं चाहता हूं कि यह तर्कों से तार पढ़े (सभी तर्क तार हैं/ शब्दों)।

और अब इसे चलाने का प्रयास करते समय मुझे सेगमेंटेशन गलती मिल रही है:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int to_morse(char *);

int main(int argc, char **argv)
{
    char morse[80];
    char *temp;
    for (int counter = 1; counter < argc; counter++)
    {
        *temp = to_morse(argv[counter]);
        strcat(temp, morse);
        printf("%s", morse);
    }

    return 0;
}

int to_morse(char *str)
{
    char *morse[27] =  {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    char *output;
    char character;

    for (int counter = 0; str[counter] != '\0'; counter++)
    {
        character = toupper(str[counter]);
        strcat(morse[character-'A'], output);
    }

    return *output;
}

मेरा मानना ​​​​है कि पॉइंटर्स का उपयोग करके तारों को पार करने का यह सही तरीका नहीं है, लेकिन मैं सही तरीके से नहीं समझ सकता। मैं अपना कोड कैसे काम कर पाऊंगा?

नोट: मुझे पता है कि इसमें कहीं डुप्लीकेट हो सकता है .. हालांकि, कई सेगमेंटेशन गलती प्रश्न हैं और वे सभी वास्तव में विशिष्ट हैं और मेरे परिदृश्य को कवर नहीं करते हैं, इसलिए मुझे एक नहीं मिला।

-4
Fanatique 7 नवम्बर 2018, 13:53

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड में बहुत कुछ गलत हो रहा है।

सबसे पहले, strcat 2 पैरामीटर लेता है - एक गंतव्य और फिर एक स्रोत। सभी मामलों में आप इसका उपयोग कर रहे हैं, आपने उन्हें गलत तरीके से प्राप्त किया है।

दूसरे, आपका फ़ंक्शन to_morse एक int देता है जब आप चाहते हैं कि वह char * लौटाए। इस तरह आप पॉइंटर्स के आसपास से गुजरते हैं।

तीसरा, आप उस फ़ंक्शन में output के लिए कोई मेमोरी आवंटित नहीं करते हैं, इसलिए भले ही आपके पास strcat सही तरीके से हो, आपके पास मोर्स कोड स्टोर करने के लिए कहीं भी नहीं है। यह वह जगह भी होगी जहां कोड क्रैश हो रहा है क्योंकि आप एक प्रारंभिक सूचक में strcat पर जा रहे हैं।

अंत में, आपको शायद यह जांचना चाहिए कि जिस चरित्र को आप मोर्स में बदलने की कोशिश कर रहे हैं वह एक अक्षर है, अन्यथा आप अपनी सरणी पर सीमा से बाहर हो जाएंगे।

यहां बताया गया है कि आपका कोड कैसा दिखना चाहिए। मैंने इसे भी बदल दिया है ताकि आप प्रत्येक मोर्स "अक्षर" के बीच एक जगह रखें अन्यथा आप यह नहीं बता पाएंगे कि एक कहां से शुरू होता है और दूसरा समाप्त होता है।

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

char *to_morse(char *);

int main(int argc, char **argv)
{
    char *temp;
    for (int counter = 1; counter < argc; counter++)
    {
        temp = to_morse(argv[counter]);
        printf("%s", temp);
        free(temp); // Always remember to free memory you allocate
    }

    return 0;
}

char *to_morse(char *str)
{
    char *morse[27] =  {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    char *output=malloc((strlen(str)*5)+1); // Always remember to allocate 1 more char than you need to store the NUL terminate when allocating memory for strings.
    output[0] = '\0'; // strcat need a null terminator in the string.
    char character;

    for (int counter = 0; str[counter] != '\0'; counter++)
    {
        if(isalpha(str[counter]))
        {
            character = toupper(str[counter]);
            strcat(output,morse[character-'A']);
            strcat(output," ");
        }
    }

    return output;
}
4
Giovanni Cerretani 7 नवम्बर 2018, 11:15