我現在正在學習 C,我的程式中有一個問題。
我需要像這樣反轉字串
I like dogs->I ekil sgod
我寫了這段代碼
char end[MAX_LEN];
char beg[MAX_LEN];
char* piece = strtok(str, " ");
strcpy(end, piece);
strcpy(beg, piece);
char* pbeg = beg;
char* prev = piece;
int n = strlen(piece)-1;
i = 0;
int n = 0;
while (piece != NULL) {
//printf("\n%s", piece);
while (piece[i] != '\0') {
*(prev n -i ) = *(pbeg i);
i ;
}
printf("\n%s", piece);
piece = strtok(NULL, " ");
strcpy(beg, piece); // also in this moment in debugging i saw this error ***Exception thrown at 0x7CBAF7B3 (ucrtbased.dll) in лаб131.exe: 0xC0000005: Access violation reading location 0x00000000.***
}
但它只回傳第一個反向的詞素。
uj5u.com熱心網友回復:
您收到例外,因為您在 strcpy 的呼叫中使用它時沒有檢查指標片是否等于 NULL
piece = strtok(NULL, " ");
strcpy(beg, piece);
同樣在 while 回圈中,您忘記了重置變數i和n指標prev。
使用函式 strtok 是一個壞主意,因為源字串可以包含應該保留在結果字串中的相鄰空格字符。此外,您有太多的陣列和指標,只會讓代碼的讀者感到困惑。
這是一個演示程式,展示了如何輕松完成任務。
#include <stdio.h>
#include <string.h>
void reverse_n( char s[], size_t n )
{
for ( size_t i = 0; i < n / 2; i )
{
char c = s[i];
s[i] = s[n-i-1];
s[n-i-1] = c;
}
}
int main(void)
{
char input[] = "I like dogs";
const char *separator = " \t";
for ( char *p = input; *p; )
{
p = strspn( p, separator );
char *q = p;
p = strcspn( p, separator );
reverse_n( q, p - q );
}
puts( input );
return 0;
}
程式輸出是
I ekil sgod
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371122.html
上一篇:在R中的各種資料幀之間回圈
