मैं किसी दिए गए अनुक्रमणिका में किसी सरणी के भीतर स्ट्रिंग को किसी अन्य सरणी में स्ट्रिंग की प्रतिलिपि बनाने के लिए संघर्ष कर रहा हूं, कोई सुझाव? किसी दिए गए इंडेक्स पर tempVal के मान को प्रिंट करने का प्रयास करते समय, यह कुछ भी वापस नहीं करता है।

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

int main(void) {

   const int NUM_VALS = 20;
   int i;
   int matchCount = 0;

   int actualInput;
   scanf("%d", &actualInput);
   char userString[actualInput][NUM_VALS];
   char tempVal[actualInput][NUM_VALS];

   for (i = 0; i < actualInput; ++i) {
      scanf("%s", userString[i]);
      // printf("%s", userString[i]);
         strncpy(userString[i], tempVal[i], strlen(userString[i])); // < -- Not sure how to make work
         printf("%s", tempVal[i]); // <-- Doesn't output anything?
   }

   return 0;
}
-3
JovanTheYugo 20 मार्च 2020, 10:27
3
strncpy दस्‍तावेज़ पढ़ें सावधानी से। विशेष रूप से वह भाग जो कहता है: यदि स्रोत संख्या से अधिक लंबा है, तो गंतव्य के अंत में कोई शून्य-चरित्र निहित रूप से संलग्न नहीं होता है। इस प्रकार, इस मामले में, गंतव्य को एक शून्य समाप्त सी स्ट्रिंग नहीं माना जाएगा (इसे इस तरह पढ़ना अतिप्रवाह होगा)।
 – 
Jabberwocky
20 मार्च 2020, 11:08

3 जवाब

फ़ंक्शन का उपयोग करें जो पढ़ने वाले वर्णों की संख्या को सीमित कर देगा और टर्मिनैटिन को भी शून्य कर देगा

for (int i = 0; i < actualInput; ++i) {
    fgets(userString[i], NUM_VALS, stdin);
    strcpy(tempVal[i], userString[i]); // < -- Not sure how to make work
    printf("%s\n", tempVal[i]); // <-- Doesn't output anything?
}
0
0___________ 20 मार्च 2020, 11:43

यह कोई आश्चर्य की बात नहीं है कि आपको कोई उपयुक्त आउटपुट क्यों नहीं मिला क्योंकि प्रदान किए गए कोड के साथ आपको शायद सेगमेंटेशन गलती मिल जाएगी। इसके अलावा, कोड में कई मुद्दे हैं। उन सभी को समझाने के लिए और शीर्षक प्रश्न का उत्तर देने से फ्रेम फट जाएगा। आप देख सकते हैं कि मैंने नीचे अपने तरीके से कोड को कैसे ठीक किया।

चार * स्ट्रैपी (चार * गंतव्य, कास्ट चार * स्रोत)

यदि destination char बफ़र इतना बड़ा नहीं है कि स्ट्रिंग को source द्वारा कॉपी किया जा सके, तो strcpy बफ़र ओवरफ़्लो उत्पन्न करने का एक संभावित जोखिम है। यह आपके मामले में ठीक है, क्योंकि प्रत्येक बफ़र्स, userString[i] और tempVal[i] की क्षमता समान है (char तत्वों की मात्रा), लेकिन यदि कोड बदलता है तो यह हानिकारक हो सकता है।

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

चार * strncpy (चार * गंतव्य, कास्ट चार * स्रोत, size_t संख्या);

strncpy एक टर्मिनेटिंग नल कैरेक्टर को जोड़ने में विफल रहता है यदि स्रोत स्ट्रिंग के पहले num कैरेक्टर में टर्मिनेटिंग \0 नहीं है।

इसके बजाय snprintf() का उपयोग करें जो 1 तक सुरक्षित है। गंतव्य बफर के आकार का प्रमाण देता है और पढ़ने के लिए वर्णों की मात्रा को सीमित करता है और 2. हमेशा एक शून्य वर्ण जोड़ता है (यह मानते हुए कि स्कैन प्रक्रिया सफल रही और कोई त्रुटि नहीं हुई):

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

int main(void) {

   const int NUM_VALS = 20;
   int i;

   int s_num;
   printf("Enter number of strings in array: ");
   scanf("%d", &s_num);
   getchar();

   char userString[s_num][NUM_VALS];
   char tempVal[s_num][NUM_VALS];

   for (i = 0; i < s_num; ++i) {
   printf("Enter string at userString[%d]: ",i);

   if(fgets(userString[i],NUM_VALS, stdin) == NULL)
   {
       // error handling
       if(ferror(stdin))
       {
            // handle I/O error.
       }
       else if(feof(stdin))
       {
           // end of file is reached.
       }
   }
   else
       userString[i][strcspn(userString[i], "\n")] = 0;

   //printf("%s", userString[i]);
   }

   printf("\n");

   for (i = 0; i < s_num; ++i) {

      if(snprintf(tempVal[i], sizeof(tempVal[i]), "%s", userString[i]) < 0)
      {
        // error handling
        fprintf(stderr,"Encoding error occurred!");
      }
      printf("tempValue[%d]: %s\n", i, tempVal[i]);
   }
   return 0;
}

एक परीक्षण चलाने पर आउटपुट:

Enter number of strings in array: 3               
Enter string at userString[0]: hello    
Enter string at userString[1]: world 
Enter string at userString[2]: test

tempValue[0]: hello
tempValue[1]: world
tempValue[2]: test
0
RobertS supports Monica Cellio 20 मार्च 2020, 17:08

क्षमा करें दोस्तों,

मैं एक कक्षा ले रहा हूं और सी के लिए नया हूं। मैं यह पता लगाने में सक्षम था कि मेरी समस्या को कैसे हल किया जाए। मैं कोड को ठीक करने के सुझावों की सराहना करता हूं, दुर्भाग्य से वे मेरे परिचय पाठ्यक्रम में मैंने जो कुछ सीखा है, उसके दायरे से बाहर हैं। मुझे एक स्ट्रिंग सरणी और लूप के लिए शब्द आवृत्तियों को खोजना था। यहाँ पूरा कार्य कोड है:

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

int main(void) {

   const int NUM_VALS = 20;
   int i;
   int j;
   int matchCount = 0;

   int actualInput;
   scanf("%d", &actualInput);

   char userString[actualInput][NUM_VALS];
   char tempVal[actualInput][NUM_VALS];

   for (i = 0; i < actualInput; ++i) {
      scanf("%s", userString[i]);
      strcpy(tempVal[i], userString[i]);
     // printf("%s\n", userString[i]);
     // printf("%s\n", tempVal[i]);
   }

   for (i = 0; i < actualInput; ++i) {
      matchCount = 0;
      for (j = 0; j < actualInput; ++j) {
         if (strcmp(userString[i], tempVal[j]) == 0) {
            matchCount++;
         }
      }
      printf("%s %d\n", userString[i], matchCount);
   }



   return 0;
}
0
JovanTheYugo 21 मार्च 2020, 09:57