我是红宝石初学者.我有以下代码,询问用户他的名字并打印回来.
print 'Enter your name : '
name = gets()
print("Hey,#{name} !")
Run Code Online (Sandbox Code Playgroud)
如果我输入John Doe作为名称,则输出如下
Hey,John Doe
!
Run Code Online (Sandbox Code Playgroud)
print不像puts输出后没有自动添加新行但我注意到在上面的情况下我输入的任何内容#{name}都打印在一个新行上.为什么会这样?
我决定在听到所有关于它的好东西之后给Ruby一个忙,但到目前为止它只给了我一个艰难的时间.很久以前我在学习Python时创建了一个"搜索引擎",它只是将数据存储在数组中并检查搜索关键字是否在其中,我一直在尝试在Ruby中做同样的事情.
虽然它不像Python那样直观,但我的搜索功能正常运行.但是,我在处理用户输入时遇到了麻烦.我想检查输入是否等于插入,搜索和退出,但它只是不起作用.我真的不知道如何使用获取,所以我假设问题与获取有关.
while true
puts 'What do you want to do?'
choice = $stdin.gets
puts choice # => quit
if choice == 'quit'
break
end
end
Run Code Online (Sandbox Code Playgroud)
该如果语句不工作.我到底做错了什么?为了上帝的缘故,这在C++中是微不足道的!
我真的很感激一些帮助.Ruby对我来说太陌生了......谢谢!
我在C中编写了一个简单的程序.一个程序用于输入一个String并将其与长度一起显示.
#include<stdio.h>
int main()
{
char a[4];
printf("Enter the name : ");
gets(a);
printf("\nThe name enterd is : %s",a);
printf("\nLength of string is : %d",strlen(a));
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序不包含警告或错误.
在运行时,我输入值" melwinsunny "作为输入.没有错误,显示的结果是:
Enter the name : melwinsunny
The name entered is : melwinsunny
length of string is : 11
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我已经声明了长度为4的字符数组(char a [4]).请解释.
这是否意味着字符数组是动态的?
在使用scanf()之后浪费了太多时间搜索为什么我的程序没有执行gets(),我找到了一个解决方案,即在scanf()之后使用fflush(stdin)来启用gets()来获取字符串.
问题是fflush(stdin)没有做到它所期望的:程序继续跳过gets(),我不能在控制台中写任何短语来读取.
我的代码是下一个:
#include <string.h>
#include <stdio.h>
int main(){
char nombre[10];
char mensaje[80];
printf("Type your name:\n");
scanf("%s", nombre);
fflush(stdin);
printf("Now, type a message:\n");
gets(mensaje);
printf("3/%s:%s",nombre,mensaje);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 正在阅读Head的第一本C书,偶然发现作者说gets()这是一个不好的做法
gets()是一个已经存在了很长时间的功能.但你真正需要知道的是你真的不应该使用它.
为什么它被认为是一种不好的做法?
gets_s()函数不适用于我的编译器.我正在使用GCC的代码块.
这是错误:
undefined reference to '_imp_gets_s.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何解决这个错误.
我试图演示缓冲区溢出,我希望覆盖一个本地变量gets.我用gcc编译了我的程序-fno-stack-protector,所以我知道使用的缓冲区gets就在我试图覆盖的另一个局部变量的旁边.我的目标是溢出缓冲区并覆盖相邻变量,以便它们都具有相同的字符串.但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者都相等.我怎么输入'\0'?
假设我有一个包含长度为10的字符串的文件:
ABCDEFGHIJ
并使用fgets()大小为4的缓冲区逐行读取我的文本文件.我将fgets()在循环中调用以确保读取整行.但是,在第一次通话时,它会读出前三个字符(buffer size -1)吗?它是否还会在我的4个char缓冲区的最后一个位置附加一个空终止字符,即使没有到达我的字符串的真正结尾,或者它将填充4个字符并且在缓冲区末尾没有空终止字符?谁打电话是strlen()不可能的?
谢谢 :)
我正在编写一个小的C代码来获取一些用户输入,这将是一个字符串.现在我在许多地方读到使用gets()将非常不安全,因为它可能导致缓冲区溢出攻击.在大多数地方,我发现替代方法是使用fgets(),就缓冲区溢出而言,这更安全.
现在我有一个问题场景,我不知道手前的缓冲区大小.它只是无法确定.它可能是任何东西.所以在这种情况下,fgets()会派上用场吗?
另外,如果我使用gets(),如下所示,解决这个问题有什么问题呢?
char * temp_buffer_to_hold_user_input = NULL;
cahr * actual_buffer_that_stores_user_input = NULL;
int length_of_user_input =0;
/* taking user input, irrespective of its length using gets() */
gets(temp_buffer_to_hold_user_input);
/* now finding the length of the user input string and allocating the required number of bytes for proper (safe) usage */
length_of_user_input=length(temp_buffer_to_hold_user_input);
actual_buffer_that_stores_user_input = (char*)malloc(length_of_user_input*sizeof(char));
strcpy(actual_buffer_that_stores_user_input, temp_buffer_to_hold_user_input);
/* and now we work with our actual buffer */
Run Code Online (Sandbox Code Playgroud)
那么gets()的上述用法是否还有缓冲区溢出问题?因为,在上面我们根本没有声明一个固定大小的缓冲区......所以没有缓冲区溢出是我所期待的.
如果我错过了什么,请纠正我!
我正在编写一个简单的程序,将数字(+ ve,32位)从二进制转换为十进制.这是我的代码:
int main()
{
int n=0,i=0;
char binary[33];
gets(binary);
for (i = 0; i < 33, binary[i] != '\0'; i++)
n=n*2+binary[i]-'0';
printf("%d",n);
}
Run Code Online (Sandbox Code Playgroud)
如果我删除binary[i]!='\0',那么由于垃圾值它会给出错误的答案,但如果我不这样做,它会给出正确的答案.我的问题是:该gets函数是否在字符串的末尾自动添加'\ 0'(NULL)字符或者这只是巧合?