source

공백 문자가 있는 입력에서 문자열을 읽으시겠습니까?

gigabyte 2022. 8. 30. 22:22
반응형

공백 문자가 있는 입력에서 문자열을 읽으시겠습니까?

Ubuntu를 사용하고 있으며 Geany와 CodeBlock도 IDE로 사용하고 있습니다.제가 하려고 하는 것은 줄을 읽는 것입니다."Barack Obama")를 사용하여 변수를 지정합니다.

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Your Name is: %s", name);

    return 0;
}

출력:

Enter your name: Barack Obama
Your Name is: Barack

어떻게 하면 프로그램이 전체 이름을 읽게 할 수 있나요?

용도:

fgets (name, 100, stdin);

100버퍼의 최대 길이입니다.당신은 필요에 따라 그것을 조정해야 합니다.

용도:

scanf ("%[^\n]%*c", name);

[]는 스캔셋 문자입니다. [^\n]는 입력이 뉴라인이 아님을 나타냅니다('\n')를 입력해 주세요.그 후,%*c입력 버퍼에서 줄바꿈 문자를 읽고(읽지 않음),*는, 이 읽기 입력이 불필요하게 파기(삭제)되는 것을 나타내고 있습니다.또, 버퍼내의 이 새로운 행은, 다음의 입력에 관한 문제를 일으키지 않습니다.

스캔 세트 및 할당 억제 연산자에 대한 내용은 여기를 참조하십시오.

주의:gets근데...

사용 안 함gets()몇 글자가 읽힐지 미리 알지 못하면 알 수 없기 때문입니다.gets()는 버퍼의 끝을 지나도 문자를 계속 저장합니다.사용하는 것은 매우 위험합니다.컴퓨터 보안을 깨기 위해 사용되었습니다.사용하다fgets()대신.

이것을 시험해 보세요.

scanf("%[^\n]s",name);

\n는 스캔한 문자열의 딜리미터를 설정합니다.

정답은 다음과 같습니다.

#include <stdio.h>

int main(void)
{
    char name[100];

    printf("Enter your name: ");
    // pay attention to the space in front of the %
    //that do all the trick
    scanf(" %[^\n]s", name);
    printf("Your Name is: %s", name);

    return 0;
}

% 앞에 있는 공간은 매우 중요합니다. 프로그램에 다른 몇 개의 스캔f가 있다고 가정하면 정수 값의 스캔f가 1개 있고 이중 값의 스캔f가 있다고 가정하면...char(문자명)에 대한 scanf에 도달하면 해당 명령어는 건너뛰어 값을 입력할 수 없습니다.그러나 % 앞에 그 공간을 두면 모든 것이 문제없이 진행됩니다.

scanf(" %[^\t\n]s",&str);

str는 문자열을 가져오는 변수입니다.

다음 예제에서는 를 사용하여 공백이 포함된 입력을 얻는 방법을 보여 줍니다.fgets기능.

#include <stdio.h>

int main()
{
    char name[100];
    printf("Enter your name: ");
    fgets(name, 100, stdin); 
    printf("Your Name is: %s", name);
    return 0;
}
#include <stdio.h>
// read a line into str, return length
int read_line(char str[]) {
int c, i=0;
c = getchar();
while (c != '\n' && c != EOF) { 
   str[i] = c;
   c = getchar();
   i++;
}
str[i] = '\0';
return i;
}

메모: fgets()를 사용하는 경우 CLI(명령줄 인터프리터)에서 작은 입력에 fgets()를 사용할 때 배열의 마지막 문자는 "\n"이 됩니다.이 경우 문자열은 "Enter"로 끝납니다.따라서 문자열을 인쇄할 때 컴파일러는 문자열을 인쇄할 때 항상 다음 행으로 이동합니다.입력 문자열에 동작과 같은 null 종단 문자열을 지정하려면 이 간단한 해크를 사용합니다.

#include<stdio.h>
int main()
{
 int i,size;
 char a[100];
 fgets(a,100,stdin);;
 size = strlen(a);
 a[size-1]='\0';

return 0;
}

업데이트: 다른 사용자의 도움을 받아 업데이트되었습니다.

"%s"는 공백에 도달할 때까지 입력을 읽습니다.

을 읽으려면 를 시작하는 것이 좋습니다(즉, 새 행에 도달할 때까지 공백을 포함한 모든 문자).

여러 행을 읽어야 할 경우 버퍼를 클리어해야 합니다.예:

int n;
scanf("%d", &n);
char str[1001];
char temp;
scanf("%c",&temp); // temp statement to clear buffer
scanf("%[^\n]",str);

이 코드를 사용하면 키보드의 Enter 키를 누를 때까지 입력을 받을 수 있습니다.

char ch[100];
int i;
for (i = 0; ch[i] != '\n'; i++)
{
    scanf("%c ", &ch[i]);
}

"Barack Obama"는 "Barack"과 "Obama" 사이에 공백이 있다.이를 수용하려면 이 코드를 사용하십시오.

#include <stdio.h>
int main()
{
    printf("Enter your name\n");
   char a[80];
   gets(a);
   printf("Your name is %s\n", a);
   return 0;
}
scanf("%s",name);

사용하다&와 함께scanf입력

상기의 방법은 유효하지만, 각각의 방법이 나름의 문제를 안고 있습니다.

사용할 수 있습니다.getline()또는getdelim()Posix 지원 플랫폼을 사용하는 경우.Windows 와 minigw 를 컴파일러로서 사용하고 있는 경우는, 사용할 수 있습니다.

getline()는 다음과 같이 정의됩니다.

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

입력을 받으려면 먼저 char type에 대한 포인터를 만들어야 합니다.

#include <stdio.h>
#include<stdlib.h>

// s is a pointer to char type.
char *s;
// size is of size_t type, this number varies based on your guess of 
// how long the input is, even if the number is small, it isn't going 
// to be a problem
size_t size = 10;

int main(){
// allocate s with the necessary memory needed, +1 is added 
// as its input also contains, /n character at the end.
    s = (char *)malloc(size+1);
    getline(&s,&size,stdin);
    printf("%s",s);
    return 0;
}

입력 예:Hello world to the world!

출력:Hello world to the world!\n

여기서 주의할 점은 에 할당된 메모리는 11바이트이지만 입력 사이즈는 26바이트이므로 getline은 재할당합니다.s사용.realloc().

따라서 입력 시간이 얼마인지는 중요하지 않습니다.

size위의 샘플 입력에 따라 읽은 바이트 수로 갱신됩니다.size될 것이다27.

getline()또한 고려하다\n입력으로.따라서 's'는 마지막에 '\n'이 됩니다.

의 일반 버전도 있습니다.getline(),어느 것이getdelim()즉, 1개의 추가 인수가 필요합니다.delimiter.

getdelim()는 다음과 같이 정의됩니다.

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Linux man 페이지

언급URL : https://stackoverflow.com/questions/6282198/reading-string-from-input-with-space-character

반응형