[英]pointer string not returning expected output
#include <stdio.h>
void revstr(char str[])
{
char temp;
int size = 0;
while(*str != '\0'){
size++;
str++;
}
for (int i = 0; i < size/2; i++)
{
temp = str[i];
str[i] = str[size-1-i];
str[size-1-i] = temp;
}
for(int i = 0; i < size; i++)
{
printf("%c\n", *(str+i));
}
}
int main()
{
char str[20];
printf("enter a string: \n");
scanf("%s", &str);
revstr(str);
return 0;
}
為什么我的 rev 字符串不打印它正在打印出一些垃圾值的字符串的反轉。 你能指出為什么嗎?
在這個while循環之后
while(*str != '\0'){
size++;
str++;
}
指針 str 不指向字符串的開頭。
相反,你可以寫例如
while( str[size] != '\0'){
size++;
}
盡管如此,這樣的 function 應該只做一件事:反轉字符串。 function 的調用者決定是否對 output 反轉字符串。
所以 function 看起來像
char * revstr( char s[] )
{
size_t n = 0;
while ( s[n] ) ++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;
}
主要是你可以寫
puts( revstr( str ) );
這是一個演示程序。
#include <stdio.h>
char * revstr( char s[] )
{
size_t n = 0;
while ( s[n] ) ++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;
}
int main(void)
{
char s[] = "Hello";
puts( s );
puts( revstr( s ) );
return 0;
}
程序 output 是
Hello
olleH
當然,您可以使用標准字符串 function strlen
來代替 while 循環。
size_t n = strlen( s );
注意在scanf
的調用中
scanf("%s", &str);
第二個參數應該是表達式str
scanf("%s", str);
我會以另一種方式實現它:
char *reverse(char *str)
{
char *wrk = str, *end = str;
if(str && *str)
{
while(*(end + 1)) end++;
while(end > wrk)
{
char tmp = *end;
*end-- = *wrk;
*wrk++ = tmp;
}
}
return str;
}
int main(void)
{
char s[] = "Hello world";
printf("%s\n", reverse(s));
}
在您的代碼中,您推進指針str以計算其長度,但之后您忘記將其重置為開頭。 此外,您對 scanf 的調用應該傳遞str ,而不是它的地址。 此外,如果用戶輸入的字符串長度超過 19 個字符,scanf 將超出str的末尾。 試試這個:
#include <stdio.h>
#include <string.h>
void revstr(char str[])
{
char temp;
int size = strlen(str);
for (int i = 0; i < size / 2; i++) {
temp = str[i];
str[i] = str[size - 1 - i];
str[size - 1 - i] = temp;
}
}
int main()
{
char str[20];
printf("enter a string: \n");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
revstr(str);
printf("%s\n", str);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.