我試圖在 c 中反轉一個字串,這起初似乎很容易,但我一直遇到一些奇怪的問題,我似乎不明白它來自哪里。
字串 c3 繼續顯示它應該顯示的更多字符
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c1[10];
char c3[10];
int i,j,l;
printf("donner la chaine a inverser\n");
fflush(stdin);
gets(c1);
for(i = 0; c1[i] != '\0'; i )
{
}
l = i;
j = 0;
for(i = l-1; i >= 0; i--)
{
printf("%d%d\n", i, j);
c3[j] = c1[i];
j ;
}
printf("%s", c3);
return 0;
}
我不太確定,但 c3 應該只有 c1 的字符數,但它表明它包含更多的printf("%s", c3);.
我對 c 中的字串還是陌生的,所以我可能錯過了一些非常明顯的東西。
uj5u.com熱心網友回復:
答案很簡單。假設您的字串是 abcdef。在 c3 中,您將放置 fedcba,其中 a 位于索引 5 處。
索引 6 會是什么?答案是“沒有人知道”。它是未定義的。這就是為什么你的字串后面有垃圾的原因。
在 C 中,字串是一個字符陣列,“空終止”(空終止意味著'\0'在最后一個字符之后有字符(或只是 a 0( not '0') )。
解決問題的簡單方法是將 c3 初始化為 0。
char c3[10] = {0};
這樣,您的陣列將填充為 NULL 字符。
uj5u.com熱心網友回復:
您沒有在 offset 處設定空終止符c3[i]。printf()將繼續讀取c3直到找到一個空位元組,因為c3未初始化的本地物件printf可能會讀取和輸出額外的字符,并且可能會讀取到具有未定義行為的陣列末尾之外。
另請注意,您不應該使用,gets()因為您無法告訴這個過時的 C 庫函式目標陣列的大小。
這是一個修改后的版本:
#include <stdio.h>
int main() {
char c1[80];
char c3[80];
int i, j, len;
printf("donner la chaine a inverser:\n");
fflush(stdin);
if (!fgets(c1, sizeof c1, stdin))
return 1;
for (len = 0; c1[len] != '\0' && c1[len] != '\n'; len )
continue;
for (j = 0, i = len; i-- > 0; j ) {
c3[j] = c1[i];
}
c3[j] = '\0'; // set the null terminator
printf("%s\n", c3);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341444.html
上一篇:如何列印在我的字串中找到的字符?
下一篇:替換所有其他特定字串
