संकेत मुझे बहुत भ्रमित करते हैं। मेरे पास एक ऐसा फ़ंक्शन है जो तर्कों के रूप में लेता है argc (तर्क की संख्या जो स्ट्रिंग्स + 1 है जो कोड का नाम है) और char* argv[], अगर मैं अच्छी तरह से समझ गया, तो पॉइंटर्स की एक सरणी है। अब परिणाम के रूप में मुझे प्रत्येक पंक्ति पर तर्क (स्ट्रिंग) और उलट स्ट्रिंग को मुद्रित करने की आवश्यकता है। इसका मतलब यह है कि अगर मैं हैलो वर्ल्ड तर्क के रूप में पास करता हूं, तो मुझे यह करना होगा:

hello olleh
world dlrow

मैंने कोड के एक हिस्से को लागू करने की कोशिश की:

int main(int argc, char *argv[])
{
    int i = 1;
    int j;

    while (i < argc)
    {
        while (argv[i][j] != 0) {
            printf("%c", argv[i][j]);
            j++;
        }
        
        i++;
    }
    return 0;
}
}

और अब मैं सचमुच खो गया हूँ। आंतरिक पाश काम नहीं करता है। मुझे पता है कि argv [i] मेरे सभी तर्कों के माध्यम से गुजरता है, लेकिन मुझे पॉइंटर्स को स्वैप करने के लिए स्ट्रिंग्स (वर्णों की सरणी) में प्रवेश करने की स्पष्ट रूप से आवश्यकता है। इसके अलावा मुझे समझ में नहीं आता कि argv [0] और * argv के बीच का अंतर क्यों है, क्योंकि सिद्धांत रूप में argv [0] सरणी के पहले तत्व को प्रिंट करता है जो एक सूचक है, इसलिए एक पता है, लेकिन इसके बजाय यह पहला तर्क प्रिंट करता है .

1
Elena Franchini 3 अक्टूबर 2020, 18:01

1 उत्तर

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

char* argv[] "एक चरित्र के लिए पॉइंटर्स की सरणी" है यह सीखना महत्वपूर्ण है कि सी में प्रकारों को कैसे पढ़ा जाए; क्योंकि, वे प्रकार सामान करने की आपकी क्षमता को सक्षम/विफल करेंगे।

प्रकार दाएं से बाएं पढ़े जाते हैं। [] एक प्रकार की सरणी है, जिसमें अनिर्दिष्ट संख्या में तत्व हैं * एक सूचक प्रकार है, char एक आधार प्रकार है। इन्हें मिलाएं, और अब आपके पास "एक चरित्र के लिए पॉइंटर्स की सरणी" है

तो argv में से कुछ प्राप्त करने के लिए, आपको पहले यह निर्दिष्ट करना होगा कि यह ऐरे में कौन सा तत्व है। argv[0] पहला तत्व निर्दिष्ट करेगा। आइए देखें कि क्या लौटाया गया है। चूंकि सरणी परिणाम का हिस्सा नहीं है, इसलिए उत्तर "एक चरित्र के लिए एक सूचक" है

 char* line = argv[0];

पॉइंटर को एक कैरेक्टर में कैप्चर करेगा, जो argv [0] में स्टोर होता है।

सी में एक char* या "एक चरित्र के लिए सूचक" एक स्ट्रिंग के लिए इस्तेमाल किया जाने वाला सम्मेलन है। सी में "स्ट्रिंग" के लिए कोई नया प्रकार नहीं है; बल्कि यह वर्णों के लिए संकेत का उपयोग करता है, जहां सूचक को आगे बढ़ाना अंततः \0 वर्ण में चलता है जो स्ट्रिंग के अंत का संकेत देता है।

int main(int argc, char* argv[]) {
   int index = 0;
   while (index <= argc) {
      char* line = argv[index];
      printf("%d, %s\n", index, line);
      index++;
   }
 }

अपने कार्यक्रम में पारित तर्कों को डंप करना चाहिए। वहां से, मुझे लगता है कि आप बाकी को संभाल सकते हैं।

ध्यान दें कि मैंने पॉइंटर को कभी भी सरणी में परिवर्तित नहीं किया है। जबकि सरणियों का उपयोग पॉइंटर्स के रूप में किया जा सकता है यदि आप कभी भी एरे के इंडेक्स को निर्दिष्ट नहीं करते हैं, तो सामान्य पॉइंटर्स को सरणियों के रूप में उपयोग नहीं किया जा सकता है जब तक कि आप उस जानकारी पर भरोसा नहीं करते हैं जो टाइप सिस्टम में नहीं है (जैसे आपने स्पष्ट रूप से पॉइंटर को एक सरणी से पकड़ लिया है) अन्यत्र)।

आपको कामयाबी मिले!

---- प्रश्न को संबोधित करने के लिए अपडेट किया गया "मैं उन्हें कैसे उलट सकता हूं?" ----

अब जब आपके पास एक सरल char* (एक चरित्र का सूचक) है, तो कोई एक स्ट्रिंग को कैसे उलट सकता है?

याद रखें कि एक स्ट्रिंग एक चरित्र के लिए एक सूचक है, जहां अगले वर्ण अंततः एक \0 वर्ण के साथ समाप्त होते हैं। पहले हमें स्ट्रिंग के अंत को खोजने की आवश्यकता होगी।

char* some_string = ...
char* position = some_string;
while (*position != 0) {
  position++;
}
// end_of_string set, now to walk backwards
while (position != some_string) {
  position--; 
  printf("%c", *end_of_string);
}
3
Edwin Buck 4 अक्टूबर 2020, 18:50