使用Visual Studio在C中反转字符串
我正在visual studio中构建一个用于反转字符串的程序,当我运行代码并输入要反转的单词时,程序崩溃了使用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
#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])}
多亏了你们两位,我的代码都错了:dchar end=strlen-1;
??并且不要忽略字符串末尾由fgets
放置的换行符。已修复它@WeatherVaneremnl标识符未找到移动remnl
函数到main
上方