উত্তর:
অন্য কয়েকটি ভাষায় স্ট্রিংয়ের জন্য সি সমর্থন করে না। সি এর একটি স্ট্রিং এর একটি অ্যারের কেবলমাত্র পয়েন্টার char
যা প্রথম নাল অক্ষর দ্বারা সমাপ্ত হয়। সি-তে কোনও স্ট্রিং কনকেনটেশন অপারেটর নেই
strcat
দুটি স্ট্রিং সংযুক্ত করতে ব্যবহার করুন । এটি করতে আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন:
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
এটি করার জন্য এটি দ্রুততম উপায় নয় তবে আপনি এখনই এটি নিয়ে উদ্বিগ্ন হওয়া উচিত নয়। নোট করুন যে ফাংশনটি কলারকে হ্যাপ বরাদ্দকৃত মেমরির একটি ব্লক প্রদান করে এবং সেই মেমরির মালিকানাতে চলে যায়। free
যখন আর প্রয়োজন হয় না তখন এটি মেমোরির কাছে কলারের দায়িত্ব ।
ফাংশনটি এভাবে কল করুন:
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
আপনি যদি পারফরম্যান্সের দ্বারা বিরক্ত হয়ে থাকেন তবে আপনি নাল-টার্মিনেটরের সন্ধানকারী বারবার ইনপুট বাফারগুলি স্ক্যান করা এড়াতে চাইবেন।
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
আপনি যদি স্ট্রিং নিয়ে প্রচুর কাজ করার পরিকল্পনা করছেন তবে স্ট্রিংয়ের ক্ষেত্রে প্রথম শ্রেণির সমর্থন রয়েছে এমন কোনও আলাদা ভাষা ব্যবহার করা আপনার পক্ষে ভাল।
stpcpy
: কোন প্রথম স্ট্রিং শেষে একটি পয়েন্টার ফেরৎ,strcpy(stpcpy(result, s1), s2);
#include <stdio.h>
int main(){
char name[] = "derp" "herp";
printf("\"%s\"\n", name);//"derpherp"
return 0;
}
ডেভিড হেফারনান তার উত্তরে বিষয়টি ব্যাখ্যা করেছিলেন এবং আমি উন্নত কোডটি লিখেছিলাম। নিচে দেখ.
যে কোনও সংখ্যক স্ট্রিং যুক্ত করতে আমরা একটি দরকারী বৈচিত্র্যমূলক ফাংশন লিখতে পারি :
#include <stdlib.h> // calloc
#include <stdarg.h> // va_*
#include <string.h> // strlen, strcpy
char* concat(int count, ...)
{
va_list ap;
int i;
// Find required length to store merged string
int len = 1; // room for NULL
va_start(ap, count);
for(i=0 ; i<count ; i++)
len += strlen(va_arg(ap, char*));
va_end(ap);
// Allocate memory to concat strings
char *merged = calloc(sizeof(char),len);
int null_pos = 0;
// Actually concatenate strings
va_start(ap, count);
for(i=0 ; i<count ; i++)
{
char *s = va_arg(ap, char*);
strcpy(merged+null_pos, s);
null_pos += strlen(s);
}
va_end(ap);
return merged;
}
#include <stdio.h> // printf
void println(char *line)
{
printf("%s\n", line);
}
int main(int argc, char* argv[])
{
char *str;
str = concat(0); println(str); free(str);
str = concat(1,"a"); println(str); free(str);
str = concat(2,"a","b"); println(str); free(str);
str = concat(3,"a","b","c"); println(str); free(str);
return 0;
}
আউটপুট:
// Empty line
a
ab
abc
মনে রাখবেন যে বরাদ্দ হওয়া মেমরিটি যখন মেমরি ফাঁস এড়াতে অপ্রয়োজনীয় হয়ে যায় তখন আপনার তা মুক্ত করা উচিত:
char *str = concat(2,"a","b");
println(str);
free(str);
int len
-> "আকার" কোডের জন্য সঠিক ধরণ size_t len
হিসাবে size_t
। এছাড়াও // room for NULL
-> // room for null character
NULL
নাল পয়েন্টার বোঝায়।
আমি ধরে নেব আপনার এক-জিনিসগুলির জন্য এটি প্রয়োজন। আমি ধরে নিচ্ছি আপনি পিসি বিকাশকারী হবেন।
স্ট্যাক, লুক ব্যবহার করুন। এটি সর্বত্র ব্যবহার করুন। ছোট বরাদ্দের জন্য কখনও ম্যালোক / ফ্রি ব্যবহার করবেন না ।
#include <string.h>
#include <stdio.h>
#define STR_SIZE 10000
int main()
{
char s1[] = "oppa";
char s2[] = "gangnam";
char s3[] = "style";
{
char result[STR_SIZE] = {0};
snprintf(result, sizeof(result), "%s %s %s", s1, s2, s3);
printf("%s\n", result);
}
}
যদি প্রতি স্ট্রিং 10 কেবি পর্যাপ্ত না হয় তবে আকারে একটি শূন্য যুক্ত করুন এবং বিরক্ত করবেন না - তারা যেভাবেই হোক স্কোপের শেষে তাদের স্ট্যাক মেমরি ছেড়ে দেবে।
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
আপনার ব্যবহার করা উচিত strcat
, বা আরও ভাল strncat
,। এটি গুগল করুন (মূলশব্দটি "মনগড়া")।
strncat()
সাবধানতা অবলম্বন : সঠিকভাবে ব্যবহার করা একটি দানবীয় কাজ। দ্রুত, ম্যানুয়ালটি না দেখে আপনি কোন দৈর্ঘ্যটি নির্দিষ্ট করবেন strncat()
? আপনি যদি "বাফারের দৈর্ঘ্য" বলে থাকেন তবে আপনি আমার বক্তব্যটি দুর্দান্তভাবে প্রদর্শন করেছেন। এটির একটি পাল্টা স্বজ্ঞাত ইন্টারফেস রয়েছে এবং যখন এটি নিরাপদে ব্যবহার করার জন্য আপনার পর্যাপ্ত ডেটা রয়েছে তখন আপনাকে প্রথমে ফাংশনটি ব্যবহার করার দরকার নেই - অন্যান্য, দ্রুত এবং আরও কার্যকর বিকল্প (যেমন strcpy()
বা memmove()
) ব্যবহার করা যেতে পারে পরিবর্তে. 'আমার কী ব্যবহার করা উচিত' প্রশ্নটি যেই হোক না কেন strncat()
, উত্তর নয়।
আপনি সি এর মতো স্ট্রিং লিটারেল যুক্ত করতে পারবেন না আপনাকে নাল টার্মিনেশন চরিত্রের জন্য স্ট্রিং আক্ষরিক আকারের একটি স্ট্রিং আক্ষরিক দুটি + একটি বাইট আকারের বাফার তৈরি করতে হবে এবং সেই বাফারে সংশ্লিষ্ট লিটারেলগুলি অনুলিপি করতে হবে এবং নিশ্চিত করতে হবে যে এটি বাতিল হয়ে গেছে is । অথবা আপনি লাইব্রেরি ফাংশন ব্যবহার করতে পারেন strcat
।
জিএনইউ এক্সটেনশন ছাড়াই:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char str1[] = "First";
const char str2[] = "Second";
char *res;
res = malloc(strlen(str1) + strlen(str2) + 1);
if (!res) {
fprintf(stderr, "malloc() failed: insufficient memory!\n");
return EXIT_FAILURE;
}
strcpy(res, str1);
strcat(res, str2);
printf("Result: '%s'\n", res);
free(res);
return EXIT_SUCCESS;
}
বিকল্পভাবে জিএনইউ এক্সটেনশন সহ:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char str1[] = "First";
const char str2[] = "Second";
char *res;
if (-1 == asprintf(&res, "%s%s", str1, str2)) {
fprintf(stderr, "asprintf() failed: insufficient memory!\n");
return EXIT_FAILURE;
}
printf("Result: '%s'\n", res);
free(res);
return EXIT_SUCCESS;
}
দেখুন যদি malloc , বিনামূল্যে এবং asprintf আরো বিস্তারিত জানার জন্য।
#include <string.h>
#include <stdio.h>
int main()
{
int a,l;
char str[50],str1[50],str3[100];
printf("\nEnter a string: ");
scanf("%s",str);
str3[0]='\0';
printf("\nEnter the string which you want to concat with string one: ");
scanf("%s",str1);
strcat(str3,str);
strcat(str3,str1);
printf("\nThe string is %s\n",str3);
}
সি তে যে কোনও দুটি স্ট্রিং জড়িত করা কমপক্ষে 3 টি উপায়ে করা যেতে পারে: -
1) স্ট্রিং 1 এর শেষে 2 স্ট্রিংটি অনুলিপি করে
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX];
int i,j=0;
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
for(i=strlen(str1);str2[j]!='\0';i++) //Copying string 2 to the end of string 1
{
str1[i]=str2[j];
j++;
}
str1[i]='\0';
printf("\nConcatenated string: ");
puts(str1);
return 0;
}
2) স্ট্রিং 1 এবং স্ট্রিং 2 স্ট্রিং 3 এ অনুলিপি করে
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX],str3[MAX];
int i,j=0,count=0;
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
for(i=0;str1[i]!='\0';i++) //Copying string 1 to string 3
{
str3[i]=str1[i];
count++;
}
for(i=count;str2[j]!='\0';i++) //Copying string 2 to the end of string 3
{
str3[i]=str2[j];
j++;
}
str3[i]='\0';
printf("\nConcatenated string : ");
puts(str3);
return 0;
}
3) strcat () ফাংশন ব্যবহার করে
#include <stdio.h>
#include <string.h>
#define MAX 100
int main()
{
char str1[MAX],str2[MAX];
printf("Input string 1: ");
gets(str1);
printf("\nInput string 2: ");
gets(str2);
strcat(str1,str2); //strcat() function
printf("\nConcatenated string : ");
puts(str1);
return 0;
}
সি তে, জেনেরিক প্রথম-শ্রেণীর অবজেক্ট হিসাবে আপনার কাছে স্ট্রিং নেই। আপনাকে এগুলি অক্ষরের অ্যারে হিসাবে পরিচালনা করতে হবে যার অর্থ আপনি কীভাবে আপনার অ্যারেগুলি পরিচালনা করতে চান তা নির্ধারণ করতে হবে। একটি উপায় হ'ল সাধারণ ভেরিয়েবলগুলি, যেমন স্ট্যাকের উপর স্থাপন। আর একটি উপায় হ'ল গতিশীলভাবে ব্যবহার করে তাদের বরাদ্দ দেওয়া malloc
।
এটির বাছাই হয়ে গেলে আপনি দুটি অ্যারে ব্যবহার করে strcpy
বা ব্যবহার করে দুটি অ্যারে কনটেনেট করতে একটি অ্যারের সামগ্রী অনুলিপি করতে পারেনstrcat
।
এটি বলার পরে, সি-র "স্ট্রিং লিটারালস" ধারণাটি রয়েছে যা সংকলন সময়ে স্ট্রিংগুলি পরিচিত। ব্যবহার করা হলে এগুলি কেবল পঠনযোগ্য মেমরিতে রাখা একটি অক্ষর অ্যারে হবে। তবে দুটি স্ট্রিং লিটারেলকে একে অপরের পাশে লিখে লিখিতভাবে তৈরি করা সম্ভব, যেমনটি "foo" "bar"
স্ট্রিং আক্ষরিক "ফুবার" তৈরি করবে।
মেমকি ব্যবহার করা হচ্ছে
char *str1="hello";
char *str2=" world";
char *str3;
str3=(char *) malloc (11 *sizeof(char));
memcpy(str3,str1,5);
memcpy(str3+strlen(str1),str2,6);
printf("%s + %s = %s",str1,str2,str3);
free(str3);
return memcpy(result, s1, len1);
। যদিও একটি মাইক্রো অপ্টিমাইজেশন বা কমপক্ষে কিছুটা কোড গল্ফিং, বেসিক স্ট্রিং ক্রিয়াকলাপগুলিতে এ জাতীয় সম্ভাব্য উন্নতিগুলি তাদের উচ্চ ব্যবহারের কারণে মূল্য দিতে পারে।