[英]Reverse of words of a given string in C using user defined functions
該代碼不起作用,它沒有給出准確的結果。 我不知道問題出在哪里或錯過了編碼? 我的輸入和 output:
Enter a sentence :
hello im here to help you
heleh im here to help you
我使用了以下代碼,
int main()
{
/*
Enter a sentence to get reverse of each word
hello this is CPROGRAM Enjoy Programming
olleh siht si MARGORPC yojnE gnimmargorP
*/
char str[100];
printf("Enter a sentence : \n");
fgets(str, 100, stdin);
revwords(str);
fputs(str, stdout);
return 0;
}
void revwords(char* str){
int i = 0;
for(int j=1;str[j] != '\0';j++){
if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
rev(str, i, j-1);
i = j+1;
j++;
}
}
}
void rev(char* str, int from, int to){
char temp;
for(int i=from;i<= to/2;i++){
temp = str[i];
str[to-i] = str[i];
str[to-i] = temp;
}
}
您的版本rev
以多種方式損壞:
void rev(char* str, int from, int to){
char temp;
for(int i=from;i<= to/2;i++){
temp = str[i];
str[to-i] = str[i];
str[to-i] = temp;
}
}
第一:你的交換壞了。 您分配給str[to-i]
兩次,從不分配給另一個方向。
void rev(char* str, int from, int to){
char temp;
for(int i=from;i<= to/2;i++){
temp = str[i];
str[i] = str[to-i];
str[to-i] = temp;
}
}
那么你的指數計算不正確。 您似乎試圖從from
到to
反轉,但您將to
視為一個長度。 您需要使用單獨的索引:
void rev(char* str, int from, int to){
char temp;
for(int i=0; i <= (to-from)/2; i++){
temp = str[from+i];
str[from+i] = str[to-i];
str[to-i] = temp;
}
}
否則,如果您從 10..15 反轉,您將復制到索引 5..0 而不是 15..10
#include<stdio.h>
int main()
{
/*
Enter a sentence to get reverse of each word
hello this is CPROGRAM Enjoy Programming
olleh siht si MARGORPC yojnE gnimmargorP
*/
char str[100];
printf("Enter a sentence : \n");
//fgets(str, 100, stdin);
scanf("%[^\n]s", str);
revwords(str);
//fputs(str, stdout);
printf("%s\n",str);
return 0;
}
void revwords(char* str){
int i = 0;
for(int j=1;str[j] != '\0';j++){
if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
rev(str, i, j-1);
i = j+1;
j++;
}
}
}
void rev(char* str, int from, int to){
char temp;
while(from <= to){
temp = str[from];
str[from] = str[to];
str[to] = temp;
from++;
to--;
}
}
你可以試試這段代碼。 在您的 rev function 代碼中,交換沒有以正確的方式完成。 對於輸入一行,您可以使用scanf("%[^\n]s", str);
.
您的代碼中的另一個錯誤是您沒有顛倒最后一句話。 所以在你的revwords function 中的for循環之外需要反轉最后一個單詞。 這不是修復此代碼,請自行嘗試,如果找不到,請發表評論。
void revwords(char* str){
int i = 0;
int j;
for(j=1;str[j] != '\0';j++){
if( str[j] == ' ' || str[j] == '\t' || str[j] == '\n'){
rev(str, i, j-1);
i = j+1;
j++;
}
}
rev(str,i,j-1);
}
使用此代碼塊進行更改,並希望它能解決。 它只是您的代碼的修改版本。
rev
和revwords
這兩個函數都不正確。
例如,通常用戶可以傳遞一個空字符串。 在這種情況下,由於 for 循環中的初始條件,function revwords
調用未定義的行為
for(int j=1;str[j] != '\0';j++){
此外,如果傳遞的字符串不包含空格,即它僅包含一個單詞,則不會反轉任何內容。
在 function rev
中循環的條件不正確
for(int i=from;i<= to/2;i++){
例如,如果form
等於3
並且to
等於5
,則表達式i <= to/2
產生2
並且永遠不會執行循環。
除此之外,交換字符的代碼
temp = str[i];
str[to-i] = str[i];
str[to-i] = temp;
也是不正確的。
並且至少 function revwords
應該具有返回類型char *
遵循標准 C 字符串函數的約定。
考慮到 function fgets
可以 append 將換行符轉換為輸入的字符串。 你應該刪除它。
這是一個演示程序,展示了如何實現這些功能。 我只重命名了 function 名稱。
#include <stdio.h>
#include <string.h>
static char * reverse( 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;
}
return s;
}
char * reverse_by_words( char *s )
{
const char *delim = " \t\n";
char *p = s;
while ( *p )
{
p += strspn( p, delim );
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
reverse( q, p - q );
}
}
return s;
}
int main(void)
{
enum { N = 100 };
char s[N];
printf( "Enter a sentence: " );
fgets( s, N, stdin );
// remove the appended new line character '\n'
s[ strcspn( s, "\n" ) ] = '\0';
puts( s );
puts( reverse_by_words( s ) );
return 0;
}
程序 output 可能看起來像
Enter a sentence: hello im here to help you
hello im here to help you
olleh mi ereh ot pleh uoy
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.