我正在嘗試撰寫自己的連接程式。我正在做的是從 獲取兩個字串作為輸入argv,創建第三個包含 長度的空字符陣列,argv[1] argv[2]然后使用兩個for回圈將每個argv字串中的字符插入到第三個字串中。
我的第一個for回圈似乎作業正常,因為我loop沒有做任何事情,所以購買第二個回圈。有任何想法嗎?
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *string1 = argv[1];
char *string2 = argv[2];
int string1Len = strnlen(string1, 50);
int string2Len = strnlen(string2, 50);
char string3[string1Len string2Len 1];
for (int i = 0; i <= string1Len; i )
{
string3[i] = string1[i];
}
for(int i = (string1Len 1); i <= (string1Len string2Len); i )
{
string3[i] = string2[i];
}
string3[string1Len string2Len 1] = '\0';
printf("%s %d %d\n", string3, string1Len, string2Len);
return 0;
}
uj5u.com熱心網友回復:
您的第二個 for 回圈“什么也沒做”,因為第一個回圈處理了該\0字符并將其包含在 中string3,因此最好設定 for 回圈處理該字符的條件
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *string1 = argv[1];
char *string2 = argv[2];
int string1Len = strlen(string1);
int string2Len = strlen(string2);
int i;
char string3[string1Len string2Len 1];
for (i = 0; string1[i]!='\0'; i )
{
string3[i] = string1[i];
}
string3[i]=' '; //with space
i;
for(int j = 0; string2[j]!='\0'; j )
{
string3[i] = string2[j];
i ;
}
string3[string1Len string2Len 1] = '\0';
printf("%s %d %d\n", string3, string1Len, string2Len);
return 0;
}
uj5u.com熱心網友回復:
兩個回圈中的索引值都不正確:
您應該在 時停止第一個回圈
i == string1Len,因此測驗應該是:for (int i = 0; i < string1Len; i )您應該使用 add
string1Len到目標字串的索引,以便將第二個字串中的位元組附加到第一個字串的位元組中:for (int i = 0; i < string2Len; i ) { string3[string1Len i] = string2[i]; }空終止符的索引是
string1Len string2Len,添加1是不正確的,因為 C 中的索引為零:string3[string1Len string2Len] = '\0';您應該測驗提供給程式的實際引數數量,以避免在缺少某些引數時出現未定義的行為。
這是一個修改后的版本:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("missing arguments\n");
return 1;
}
char *string1 = argv[1];
char *string2 = argv[2];
int string1Len = strnlen(string1, 50);
int string2Len = strnlen(string2, 50);
char string3[string1Len string2Len 1];
for (int i = 0; i < string1Len; i ) {
string3[i] = string1[i];
}
for (int i = 0; i < string2Len; i ) {
string3[string1Len i] = string2[i];
}
string3[string1Len string2Len] = '\0';
printf("%s %d %d\n", string3, string1Len, string2Len);
return 0;
}
uj5u.com熱心網友回復:
您的代碼中有兩個主要問題。您的第一個for回圈nul從string1;復制終止符 因此,您string3 在此之后添加的任何內容都將被諸如 之類的函式忽略printf,因為它們將其nul視為標記字串的結尾。
在您的第二個for回圈中,您遇到了同樣的問題,更重要的是,i您使用的索引對 無效string2,因為您已將 的長度添加string1到它。
另外,請注意 C 中的陣列從零開始,因此您不應將 1 添加到最終nul終止符的位置。
這是您當前代碼的“快速修復”:
for (int i = 0; i < string1Len; i ) { // Use "<" in place of "<=" or we copy the null terminator
string3[i] = string1[i];
}
for (int i = 0; i < string2Len; i ) { // Start "i" at 0 for valid "string2" index ...
string3[i string1Len] = string2[i]; // ... and add "string1Len" for the destination index
}
string3[string1Len string2Len] = '\0'; // Arrays start at ZERO, so don't add 1 for "nul" terminator position
但是,還有一些其他要點和可能的改進。請注意,該strnlen函式回傳一個size_t型別,因此最好將它用于索引。此外,您知道i第一個回圈末尾的索引對下一個字符仍然有效,您可以在第二個回圈中重復使用它(只要您在第一個回圈之外宣告它),并且您可以為源字串使用第二個索引。
此外,正如 chqrlie 所指出的,您確實應該檢查argv陣列中是否有足夠的源資料。
這是您的程式的一個版本,其中包含這些附加更改:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
if (argc < 3) {
// Error-handling code
return 1;
}
char* string1 = argv[1];
char* string2 = argv[2];
size_t string1Len = strnlen(string1, 50);
size_t string2Len = strnlen(string2, 50);
size_t i, j;
char string3[string1Len string2Len 1];
for (i = 0; i < string1Len; i ) {
string3[i] = string1[i];
}
for (j = 0; j < string2Len; j , i ) {
string3[i] = string2[j];
}
string3[i] = '\0';
printf("%s %zu %zu\n", string3, string1Len, string2Len); // "%zu" for "size_t"
return 0;
}
uj5u.com熱心網友回復:
您可以通過使用該memcpy功能來簡化(和優化)它
int main(int argc, char **argv) {
if (argc < 3) return 1;
char *string1 = "abc";
char *string2 = "defg";
const size_t string1Len = strlen(string1);
const size_t string2Len = strlen(string2);
char *string3 = malloc((string1Len string2Len 1) * sizeof(char));
memcpy(string3, string1, string1Len);
memcpy(string3 string1Len, string2, string2Len 1);
printf("%s %d %d", string3, string1Len, string2Len);
free(string3);
return 0;
}
正如其他人所說,注意 nul 終止符
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350580.html
上一篇:F#我無法從字串列印字符
下一篇:為什么設定物件拆分字串?
