使用Visual Studio在C中反转字符串

使用Visual Studio在C中反转字符串,c,string,visual-studio,reverse,C,String,Visual Studio,Reverse,我正在visual studio中构建一个用于反转字符串的程序,当我运行代码并输入要反转的单词时,程序崩溃了 #include <stdio.h> #include <conio.h> #include <string.h> main(void) { char r[256]; int i, d; printf("\nEnter the word you want to reverse : "); gets_s(" %s", r

我正在visual studio中构建一个用于反转字符串的程序,当我运行代码并输入要反转的单词时,程序崩溃了

#include <stdio.h>
#include <conio.h>
#include <string.h>

main(void) {
    char r[256];
    int i, d;
    printf("\nEnter the word you want to reverse : ");
    gets_s(" %s", r, sizeof(r));
    d = strlen(r);
    for (i=d;i!=0;i--) {
        printf("%s",i);
    }
    return 0;
}
#包括
#包括
#包括
主(空){
charr[256];
int i,d;
printf(“\n输入要反转的单词:”;
获取_s(“%s”,r,sizeof(r));
d=斯特伦(r);
对于(i=d;i!=0;i--){
printf(“%s”,i);
}
返回0;
}
使用
fgets
函数,并将反转代码放在它自己的函数中,就像我做的那样。最后的代码是

int main()
{
    char line[80];

    fgets(line, 80, stdin);
    /* don't allow empty string */
    if (*line == '\0') {
        fprintf(stderr, "Empty string is not a string\n");
        return 1;
    }
    /* remove the \n placed by fgets */
    remnl(line);
    rev(line);
    printf("%s\n", line);

    return 0;
}
void remnl(char *s) { s[strlen(s) - 1] = 0; }
使用
fgets
函数,并将反转代码放在它自己的函数中,就像我做的那样。最后的代码是

int main()
{
    char line[80];

    fgets(line, 80, stdin);
    /* don't allow empty string */
    if (*line == '\0') {
        fprintf(stderr, "Empty string is not a string\n");
        return 1;
    }
    /* remove the \n placed by fgets */
    remnl(line);
    rev(line);
    printf("%s\n", line);

    return 0;
}
void remnl(char *s) { s[strlen(s) - 1] = 0; }
#包括
#包括
#包括
内部主(空){
charr[256];
int i,d;
printf(“\n输入要反转的单词:”;
获取_s(r,sizeof(r));
d=strlen(r)-1;
对于(i=d;i>=0;i--){
printf(“%c”,r[i]);
}
_getch();
返回0;
}
#包括
#包括
#包括
内部主(空){
charr[256];
int i,d;
printf(“\n输入要反转的单词:”;
获取_s(r,sizeof(r));
d=strlen(r)-1;
对于(i=d;i>=0;i--){
printf(“%c”,r[i]);
}
_getch();
返回0;
}

<代码> < P>请注意,我在Linux上尝试过你的程序,所以没有MS VisualC++,更具体地说,没有<代码> CONIO。 您的程序存在多个问题:

您对
gets\u s
的调用不正确,根据和,
gets\u s
定义为:

char *gets_s( 
  char *buffer,
  size_t sizeInCharacters
);
您使用非法参数调用它。而不是
获取_s(“%s”,r,sizeof(r))您需要这样称呼它:

gets_s(r, 256);
for (i=d-1;i>=0;i--) {
第一个参数是指向字符串缓冲区的指针,
get\u s
函数将在其中存储来自输入的行,第二个参数是缓冲区的大小,请注意,在
charr[256]
中,可以存储255个字符并以零结尾(
\0

您的for循环不正确,而不是for(i=d;i!=0;i--){
您需要这样做:

gets_s(r, 256);
for (i=d-1;i>=0;i--) {
现在循环从最后一个字符开始,而不是从
\0
开始,并在
i<0
时结束。最后一次打印将在
i=0
时结束

最后一个错误是您错误地使用了
printf
而不是
printf(“%s”,i);
您需要执行以下操作:

printf("%c",r[i]);
因为您正在打印字符:
%c
用于
char
输出,
r[i]
是字符串
r
中的第i个字符(不要忘记我们从0开始计数)

因此,总的来说,程序应该是这样的:

#include <stdio.h>
#include <conio.h> // does not exist on GCC (Linux)
#include <string.h>

main(void) {
    char r[256]; // 255 characters + \0
    int i, d;
    printf("\nEnter the word you want to reverse : ");
    gets_s(r, 256); // store at most 255 characters + \0 
                    // does not work on GCC (Linux) even with -std=C11
    d = strlen(r);

    // start from last character and include first
    for (i=d-1;i>=0;i--) {
        // %c - character, r[i] gets the i-th character from string r
        printf("%c",r[i]);
    }
    return 0;
}
#包括
#include//在GCC(Linux)上不存在
#包括
主(空){
字符r[256];//255个字符+\0
int i,d;
printf(“\n输入要反转的单词:”;
获取_s(r,256);//最多存储255个字符+\0
//即使使用-std=C11,也无法在GCC(Linux)上工作
d=斯特伦(r);
//从最后一个字符开始,包括第一个字符
对于(i=d-1;i>=0;i--){
//%c-字符,r[i]从字符串r中获取第i个字符
printf(“%c”,r[i]);
}
返回0;
}

<代码> < P>请注意,我在Linux上尝试过你的程序,所以没有MS VisualC++,更具体地说,没有<代码> CONIO。 您的程序存在多个问题:

您对
gets\u s
的调用不正确,根据和,
gets\u s
定义为:

char *gets_s( 
  char *buffer,
  size_t sizeInCharacters
);
您正在使用非法参数调用它。您需要像这样调用它,而不是
get_s(“%s”,r,sizeof(r));

gets_s(r, 256);
for (i=d-1;i>=0;i--) {
第一个参数是指向字符串缓冲区的指针,
get\u s
函数将在其中存储来自输入的行,第二个参数是缓冲区的大小,请注意,在
charr[256]
中,可以存储255个字符并以零结尾(
\0

您的for循环不正确,而不是for(i=d;i!=0;i--){
您需要这样做:

gets_s(r, 256);
for (i=d-1;i>=0;i--) {
现在循环从最后一个字符开始,而不是从
\0
开始,并在
i<0
时结束。最后一次打印将在
i=0
时结束

最后一个错误是您错误地使用了
printf
而不是
printf(“%s”,i);
您需要执行以下操作:

printf("%c",r[i]);
因为您正在打印字符:
%c
用于
char
输出,
r[i]
是字符串
r
中的第i个字符(不要忘记我们从0开始计数)

因此,总的来说,程序应该是这样的:

#include <stdio.h>
#include <conio.h> // does not exist on GCC (Linux)
#include <string.h>

main(void) {
    char r[256]; // 255 characters + \0
    int i, d;
    printf("\nEnter the word you want to reverse : ");
    gets_s(r, 256); // store at most 255 characters + \0 
                    // does not work on GCC (Linux) even with -std=C11
    d = strlen(r);

    // start from last character and include first
    for (i=d-1;i>=0;i--) {
        // %c - character, r[i] gets the i-th character from string r
        printf("%c",r[i]);
    }
    return 0;
}
#包括
#include//在GCC(Linux)上不存在
#包括
主(空){
字符r[256];//255个字符+\0
int i,d;
printf(“\n输入要反转的单词:”;
获取_s(r,256);//最多存储255个字符+\0
//即使使用-std=C11,也无法在GCC(Linux)上工作
d=斯特伦(r);
//从最后一个字符开始,包括第一个字符
对于(i=d-1;i>=0;i--){
//%c-字符,r[i]从字符串r中获取第i个字符
printf(“%c”,r[i]);
}
返回0;
}

您想打印
r[i]
,而不是
i
…并且不使用此格式说明符。
获取s(“%s”,r,sizeof(r));
-->
获取s(r,sizeof(r));
对于(i=d-1;i>=0;i--{printf(“%c”),r[i;}
多亏了你们两位,我的代码都错了:你们想打印
r[i]
,而不是
i
…并且不使用此格式说明符。
获取s(“%s”,r,sizeof(r));
-->
获取s(r,sizeof(r));
对于(i=d-1;i>=0;i--{printf(“%c”,r[i])}
多亏了你们两位,我的代码都错了:d
char end=strlen-1;
??并且不要忽略字符串末尾由
fgets
放置的
换行符。已修复它@WeatherVaneremnl标识符未找到移动
remnl
函数到
main
上方