[英]How to cast char to string in C?
我是C語言新手,使用strcat()時遇到問題。 我查了一下strcat,發現它以字符串作為參數,但是當我從char數組中拆分項目時,是一個char,當我將其用作strcat的參數時,它會打印出錯誤。
#include <stdio.h>
#include <string.h>
int main()
{
char a[10]="abcdefg123";
char *pa=a;
char *out[2]={"",""};
int counter=0;
while(*pa != '\0'){
if (counter%2==0){
strcat(out[0],*pa);
}
else{
strcat(out[1],*pa);
}
counter++;
pa++;
}
printf("%s,%s\n",out[0],out[1]);
return 0;
}
該代碼的目的是將一個字符串拆分為兩個字符串,每個字符串包含所有位於奇數位置或偶數位置的字符。但是,當我試圖取消對char指針的引用時,我得到的只是一個Char,但似乎我需要一個字符串
在strcat
使用臨時字符串,而不是strcat(out[0],*pa);
。
另外,請確保為out
分配了足夠的內存。
int main()
{
char a[10]="abcdefg123";
char temp[2] = {0};
char *pa=a;
// This is not good for `strcat`.
// char *out[2]={"",""};
// Use this instead.
char out[2][20]={"",""};
int counter=0;
while(*pa != '\0'){
temp[0] = *pa;
if (counter%2==0){
strcat(out[0], temp);
}
else{
strcat(out[1], temp);
}
counter++;
pa++;
}
printf("%s,%s\n",out[0],out[1]);
return 0;
}
點1.按照strcat()
的手冊頁
。 .. dest字符串必須有足夠的空間用於結果。
點strcat()
的第二個參數是const char *
,因此調用不能為strcat(out[0],*pa);
。 您需要為此使用一個臨時數組,該臨時數組將僅保留值*pa
。 否則,您可以像這樣使用strncat()
strncat(out[0], pa, 1); // copy only 1 char
在以后的情況下,您不需要任何臨時數組。
參考:再次在手冊頁中,
strncat()
函數與之類似,不同之處在於它將最多使用src
n
個字節,並且如果src
包含n
或更多字節,則不需要以空值結尾。
strcat()需要一個以null終止的字符串的指針。 您正在取消引用給出字符的指針(使用*運算符)。 您不能簡單地將char轉換為指向sting的指針。 您可能希望使用memcpy()而不是strcat(),但是對於復制單個字節,可以在左側和右側使用*運算符進行簡單分配。 但是正如其他人指出的那樣,您的代碼並沒有為復制char分配空間,因此您將需要進行其他更改來解決此問題。 另外,您還必須記住將最終的空字節復制到兩個輸出字符串的末尾。
在C語言中,“字符串”實際上只是指向字符的指針。 字符串從該字符開始到終止的0字節( NUL
)。
如果取消引用字符串指針,則會在該位置獲得字符。 如果指針指向字符串的開頭,則將獲得字符串的第一個字符。
您的程序有一些問題。 首先,您需要為新字符串分配空間。 strcat()
會嘗試將字符復制到任何地方,但這是您的工作,以確保在那里有空間並且可以在那兒書寫。 out
的聲明只是聲明了兩個指針,並將它們初始化為指向長度為零的常量字符串。 相反,您需要分配存儲空間,例如:
char out0[64], out1[64];
char *out[]={out0, out1};
這使得每64個字符兩個輸出緩沖器,然后建立out
與指向它們的指針。
另一個問題:您為char數組聲明了10的長度,但是隨后使用length-10字符串對其進行了初始化。 這意味着沒有空間可用於終止NUL字節,C不會放一個。 然后strcpy()
或strcat()
將從字符串中復制多余的垃圾,直到碰巧有一個NUL字節為止。 如果幸運的話,馬上就會有一個錯誤,並且不會發現錯誤,但是如果不幸運的話,您將得到奇怪的垃圾。
只需讓編譯器計算您的字符串中有多少字節,然后做正確的事即可。 省略長度:
char a[]="abcdefg123";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.