我可以使用这种技术指定scanf要读取的最大字符数buffer:
char buffer[64];
/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);
Run Code Online (Sandbox Code Playgroud)
但是如果我们在编写代码时不知道缓冲区长度怎么办?如果它是函数的参数怎么办?
void function(FILE *file, size_t n, char buffer[n])
{
/* ... */
fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}
Run Code Online (Sandbox Code Playgroud)
此代码容易受到缓冲区溢出的影响,因为fscanf不知道缓冲区有多大.
我记得以前见过这个,并开始认为这是解决问题的方法:
fscanf(file, "%*[^\n]", n, buffer);
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是,*in "%*[*^\n]"意味着最大字符串大小传递一个参数(在这种情况下n).这就是*in 的含义printf.
当我检查文档时,scanf我发现它意味着scanf应该丢弃结果[^\n].
这让我有些失望,因为我认为能够动态传递缓冲区大小是一个非常有用的功能scanf.
有没有办法可以scanf动态地传递缓冲区大小?
我的程序可以接受任意长度或空输入.但是,如果输入为空(空格或换行符),程序将继续等待输入.我也试过fgets但是如果按下空格/换行符,它仍然会在关闭之前等待更多不是空格/换行符的输入.
简化代码:
#include <stdio.h>
main()
{
int num;
scanf("%i",&num);
printf("%i",num);
}
Run Code Online (Sandbox Code Playgroud)
输入:
363792
Run Code Online (Sandbox Code Playgroud)
输出:
363792
Run Code Online (Sandbox Code Playgroud)
期望:
输入:
输出:
我是C的新手,我很难完成这项任务.
尝试使用fgets:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int n;
char s[20];
fgets(s,20,stdin);
n = atoi(s);
printf("%i",n);
}
Run Code Online (Sandbox Code Playgroud)
编辑:结果我没有正确编译代码.所以每当我尝试进行更改时,它只是使用scanf查看原始代码.
我正在尝试在其他地方写一个输入的字符串,并且不知道如何取消作为此字符串的一部分出现的新行,我用stdin和fgets获取.
char buffer[100];
memset(buffer, 0, 100);
fgets(buffer, 100, stdin);
printf("buffer is: %s\n stop",buffer);
Run Code Online (Sandbox Code Playgroud)
我试图限制fgets获取的数据量,并限制写入多少数据,但新行仍然存在.我怎样才能简单地将输入的字符串放到最后写的字符中?
这是使用C实现cd系统调用的代码.此代码的问题是它没有进入if条件 if(strcmp(buffer,"cd") == 0)
而我无法理解为什么.
#include<sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include<dirent.h>
#include<error.h>
#define BUFFERSIZE 20
int main(){
char *args[80];
char buffer[BUFFERSIZE];
char *prompt = "OS";
char *a = ">";
printf("%s%s",prompt,a);
fgets(buffer, BUFFERSIZE, stdin);
char *tok;
tok = strtok (buffer," ");
while(buffer != NULL){
buffer[strlen(buffer)-1] = '\0';
pid_t pid;
pid = fork();
if(pid < 0){
fprintf(stderr, "Fork failed");
return 1;
}
else if(pid == 0){
if(strcmp(buffer,"cd") == 0){
tok = strtok(NULL,"\n");
cd(tok);
}
printf("%s%s",prompt,a);
fgets(buffer, BUFFERSIZE, stdin); …Run Code Online (Sandbox Code Playgroud) fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
Run Code Online (Sandbox Code Playgroud)
如果我输入quit,它不会退出程序; 我想知道为什么会这样.
顺便input声明为char *input;.
C语言中的新文件,尝试通过fread读取文件
这是文件的内容:
line1 how
Run Code Online (Sandbox Code Playgroud)
使用的代码:
char c[6];
fread(c,1,5,f1)
Run Code Online (Sandbox Code Playgroud)
输出var'c'时,内容在末尾显示随机字符(例如:line1*)
fread不会终止字符串或我错过了什么?
我正在从我的字典中读取并打印出单词+单词的长度以用于测试目的.
我使用strlen来获取字符串的长度.但是,我得到的数字不正确.我相信strlen不计算\ 0字符.
我正在读字典中的前10个单词.我的预期输出应该是:
W:A L:1
W:A's L:3
W:AA's L:4
W:AB's L:4
W:ABM's L:5
W:AC's L:4
W:ACTH's L:6
W:AI's L:3
W:AIDS's L:6
W:AM's L:4
Run Code Online (Sandbox Code Playgroud)
但这就是我得到的(请注意L:如何在另一条线上.我认为这就是问题所在):
W:A
L:2
W:A's
L:4
W:AA's
L:5
W:AB's
L:5
W:ABM's
L:6
W:AC's
L:5
W:ACTH's
L:7
W:AI's
L:5
W:AIDS's
L:7
W:AM's
L:5
Run Code Online (Sandbox Code Playgroud)
以下是我的代码:
FILE* dict = fopen("/usr/share/dict/words", "r"); //open the dictionary for read-only access
if(dict == NULL) {
return;
}
int i;
i = 0;
// Read each line of the file, and insert the word in …Run Code Online (Sandbox Code Playgroud) 如果我输入"test",为什么这段特殊的代码在strstr()上返回false?
char input[100];
int main()
{
fgets(input, 100, stdin);
printf("%s", input);
if(strstr("test message", input))
{
printf("strstr true");
}
}
Run Code Online (Sandbox Code Playgroud)
我以为strstr在第一个参数中搜索了第二个参数的实例?当我用一些文本替换输入或直接分配它时,它可以工作,但它似乎不适用于fgets.
当我尝试使用fread()将文件复制到字符串时,我从文件中获取了与新行数完全相同的额外字符。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define LEN 5000000
int main()
{
char *in = (char*) malloc(LEN);
FILE *f=fopen("in.txt","r");
fread(in,5000000,1,f);
printf("%ld\n", ftell(f));
in[ftell(f)]=0;
int l;
for(l=0;true;l++)
{
if(in[l]<10)
break;
printf("%d ",in[l]);
}
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
该程序的输入是:
1
2
<newline>
Run Code Online (Sandbox Code Playgroud)
输入链接:https://paste.fedoraproject.org/388281/46780193/
对于输出,我正在打印读取的字符的 ASCII 值:
6
49 10 50 10 13 10
Run Code Online (Sandbox Code Playgroud)
如果输入是:
1
2
3
<newline>
Run Code Online (Sandbox Code Playgroud)
输入链接: https: //paste.fedoraproject.org/388280/
然后输出是:
9
49 10 50 10 51 10 51 13 10
Run Code Online (Sandbox Code Playgroud)
我看到了其他一些测试用例。在每个测试用例中,额外的字符数始终是新行数。
我有几个问题:
-为什么图案是这样的?
-这与 Windows 中新行占用 2 个字节的事实有何关系?
- 如何去掉那些多余的字符? …
我正在尝试捕获通过stdin流输入的所有字符(EOF 除外)。我想输入一个多行文本:每行\n末尾。
int getline(char s[])
{
printf("Call-getline()\n");
int c;
int idx=0;
while((c=getchar()) != EOF)
{
s[idx++] = c;
}
printf("\n-EOF found--\n");
s[idx] = '\0';
return idx;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何摆脱\n按 Enter 时得到的那个,我想知道shif+entervs 是否enter alone有什么不同。我阅读了它在 Microsoft Word 中的作用:新段落与换行符。