相关疑难解决方法(0)

在C中动态指定scanf的最大字符串长度(如printf中的"%*s")

我可以使用这种技术指定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动态地传递缓冲区大小?

c size io buffer scanf

15
推荐指数
2
解决办法
1万
查看次数

接受C中的空字符串

我的程序可以接受任意长度或空输入.但是,如果输入为空(空格或换行符),程序将继续等待输入.我也试过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查看原始代码.

c input

15
推荐指数
3
解决办法
5639
查看次数

如何在不使用fgets包含换行符的情况下从输入中获取字符串?

我正在尝试在其他地方写一个输入的字符串,并且不知道如何取消作为此字符串的一部分出现的新行,我用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 stdin newline fgets

11
推荐指数
2
解决办法
2万
查看次数

使用C-if条件实现cd系统调用

这是使用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)

c cd

10
推荐指数
1
解决办法
2万
查看次数

fgets()包括最后的换行符

fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

如果我输入quit,它不会退出程序; 我想知道为什么会这样.

顺便input声明为char *input;.

c string fgets

9
推荐指数
2
解决办法
4万
查看次数

函数fread没有通过\ 0终止字符串

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不会终止字符串或我错过了什么?

c fread

8
推荐指数
1
解决办法
9174
查看次数

strlen没有给出正确的字符串长度C.

我正在从我的字典中读取并打印出单词+单词的长度以用于测试目的.

我使用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)

c io strlen

6
推荐指数
1
解决办法
705
查看次数

strstr不起作用

如果我输入"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.

c input fgets strstr

5
推荐指数
2
解决办法
5761
查看次数

为什么 c 中的 fread() 会读取额外的“#newlines”字符?

当我尝试使用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 个字节的事实有何关系?
- 如何去掉那些多余的字符? …

c file-io fread

5
推荐指数
1
解决办法
6172
查看次数

Shift + Enter 与在控制台中输入

我正在尝试捕获通过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 中的作用:新段落与换行符。

c enter shift

5
推荐指数
1
解决办法
942
查看次数

标签 统计

c ×10

fgets ×3

fread ×2

input ×2

io ×2

buffer ×1

cd ×1

enter ×1

file-io ×1

newline ×1

scanf ×1

shift ×1

size ×1

stdin ×1

string ×1

strlen ×1

strstr ×1