我有這個代碼,它將中的每個字母加倍nabucco:
#include<stdio.h>
#include<string.h>
int main(){
char string1[20] = "nabucco";
char string2[40];
int j=-1;
for(int i=0; i<strlen(string1);i ){
j ;
string2[j] = string1[i];
j ;
string2[j] = string1[i];
}
printf("string1=\t%s\n",string1);
printf("string2=\t%s\n",string2);
}
string2設定為 并列印nnaabbuuccccoo。
但是,當我嘗試設定j=0; string2列印件(并且大概設定為)時,什么也沒有。
如果j=0在進入回圈之前,則 j 在回圈中遞增到 1 for,這開始設定 empty 的第二個元素string2。幕后是否有什么東西阻止了除第一個之外的任何元素的設定?我不明白是什么導致了這種行為。
uj5u.com熱心網友回復:
發布的程式具有未定義的行為,因為您沒有在string2.
如果您從 開始j=0,您永遠不會設定 的值,string2[0]因為您j在使用它之前增加了它,因此該位置仍然無法確定。
可能的修復:
#include<stdio.h>
#include<string.h>
int main(){
char string1[20] = "nabucco";
char string2[40];
size_t j=0;
for(size_t i=0, len = strlen(string1); i<len; i ) {
string2[j ] = string1[i]; // increase j "after" using the current value
string2[j ] = string1[i];
}
string2[j] = '\0'; // add null terminator
printf("string1=\t%s\n",string1);
printf("string2=\t%s\n",string2);
}
另一種方法是string2在創建時進行初始化:
#include<stdio.h>
#include<string.h>
int main(){
char string1[20] = "nabucco";
char string2[40] = {0}; // zero initialized
for(size_t i=0, j=0, len = strlen(string1); i<len; i ) {
string2[j ] = string1[i];
string2[j ] = string1[i];
}
printf("string1=\t%s\n",string1);
printf("string2=\t%s\n",string2);
}
uj5u.com熱心網友回復:
你在第一次使用它之前增加計數器,所以如果你在第一次使用它之前設定j=0你做j ,這意味著你從string2[1].
你可以像這樣改變它:
int j=0;
for(int i=0; i<strlen(string1);i ){
string2[j] = string1[i];
j ;
string2[j] = string1[i];
j ;
}
uj5u.com熱心網友回復:
當你這樣做時
printf("string2=\t%s\n",string2);
并且string2是從第二個字符開始設定的,這是一種未定義的行為(另請參閱此答案)。string2[0]未初始化,并且可以包含任何內容(從敏感資料到其他函式無法成功決議的內容 - 好吧,這里是單個字符;在其他情況下,如果您開始使用j=20例如)。這就是為什么要不惜一切代價避免未定義行為的原因。
在這種情況下,平臺、編譯器和行程的怪癖使得第一個字符是零。由于 C 字串以零結尾,并string2 以零開頭,因此不printf列印任何內容。如果你列印這樣的東西,“。” 是一個 0 字符(ASCII 0),
"nnaa.bbuuccoo."
你只會得到“nnaa”。出于同樣的原因,printf'ing ".nnabbuuccoo" 一無所獲。
如果string2要從第二個字符開始列印,則會得到不同的結果:
printf("string2=\t%s\n",string2 1);
uj5u.com熱心網友回復:
在 for 回圈之后,字符陣列string2不包含字串,因為您忘記在它后面附加終止符零字符'\0'。所以這個電話printf
printf("string2=\t%s\n",string2);
呼叫未定義的行為。
解決問題的最簡單方法是在其宣告中初始化陣列。例如
char string2[40] = "";
至于這個說法
但是,當我嘗試設定 j=0; string2 不列印(并且可能設定為)什么都不列印。
然后在 for 回圈中,變數j立即遞增。
int j = 0;
for(int i=0; i<strlen(string1);i ){
j ;
string2[j] = string1[i];
//...
所以陣列的第一個字符string2沒有設定。
在這種情況下,最好按以下方式撰寫 for 回圈
size_t j = 0;
for ( size_t i = 0, n = strlen( string1 ); i < n; i ){
string2[j ] = string1[i];
string2[j ] = string1[i];
}
string2[j] = '\0';
uj5u.com熱心網友回復:
這是因為 C 中的字串以空字符結尾。因此,當您在回圈外設定 j=0 時,您將跳過設定保持為空的第一個字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326786.html
