我有一個保持陣列字符一個的字串,并希望找到它的后綴。如果我在陣列中添加 7 個字符,字符總數應該是 7*8/2 = 28。所以 suffix_array 限制應該是 28。當我嘗試創建后綴陣列時,我注意到陣列也有空字符。所以我的輸出是錯誤的。這是什么原因?
#include <stdio.h>
#include <stdlib.h>
static char *suffix;
int main()
{
char s[7] = {'c','o','n','n','e','c','t'};
suffix = (char*) malloc(sizeof (char)*28);
int j;
static int k=0;
j=k;
for(int i=0; i<28; i ) {
suffix[i] = s[j];
printf("%c ", suffix[i]);
if(j<7) {
j ;
}
else {
k ;
j=k;
}
}
return 0;
}
Output:
c o n n e c t o n n e c t n n e c t n e c t e c
uj5u.com熱心網友回復:
你最終得到 j==7 ( if (j<7) { j ; }),它超出了s.
代替
if(j<7) {
j ;
}
else {
k ;
j=k;
}
和
j ;
if(j==7) {
k ;
j=k;
}
提示:
硬編碼 7 和 28 是個壞主意(包括 Vlad 的做法)。最好使用
char s[] = {...}; size_t n = sizeof(s)/sizeof(s[0]);(if array)const char *s = "connect"; size_t n = strlen(s);(if string)你并沒有真正使用
suffix. 但是,如果您想在 中構建一個字串suffix,請確保為尾隨的 NUL 再分配一個字符并添加尾隨的 NUL!
uj5u.com熱心網友回復:
即使在第一次迭代中 for 回圈也會呼叫未定義的行為
for(int i=0; i<28; i ) {
suffix[i] = s[j];
printf("%c ", suffix[i]);
if(j<7) {
j ;
}
//...
當j等于時6增加
if(j<7) {
j ;
}
所以j變得等于7并且這個值在賦值陳述句中的回圈的下一次迭代中使用
suffix[i] = s[j];
因此,可以訪問超出陣列最后一個元素的記憶體,s因為該陣列的有效索引范圍是[0, 7 )。
注意在檔案作用域內宣告變數后綴并把區域變數設為靜態沒有太大意義。
您的程式至少可以通過以下方式簡化
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
enum { N = 7, M = ( N * ( N 1 ) ) / 2 };
const char s[N] = { 'c','o','n','n','e','c','t' };
char *suffix = malloc( sizeof( char ) * M );
for ( size_t i = 0, k = 0, j = k; i < M; i )
{
suffix[i] = s[j ];
printf("%c ", suffix[i]);
if ( j == N ) j = k;
}
free( suffix );
return 0;
}
程式輸出是
c o n n e c t o n n e c t n n e c t n e c t e c t c t t
請注意,當不再需要動態分配的陣列時,應始終釋放它們。
實際上在這個程式中不需要動態分配結果陣列。你可以寫
char suffix[M];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/359196.html
上一篇:將值添加到動態陣列時出現分段錯誤
下一篇:行內for回圈python回傳
